varias superponer studio seleccionar lineas graficos graficas filas r rbind

studio - superponer graficas en r



¿Cómo puedo enlazar vectores que coincidan con sus nombres de columna? (7)

¿Por qué no solo rbind(l$row1, l$row2[names(l$row1)]) . También funciona bien para marcos de datos. Tenga en cuenta que esto descartará las columnas de l$row2 que no aparecen en l$row1 .

rbind no comprueba los nombres de las columnas al enlazar vectores:

l = list(row1 = c(10, 20), row2 = c(20, 10)) names(l$row1) = c("A", "B") names(l$row2) = c("B", "A") l $row1 A B 10 20 $row2 B A 20 10 rbind(l$row1, l$row2) A B [1,] 10 20 [2,] 20 10

¿Cómo puedo producir esta matriz a partir de una serie de elementos de la lista, asegurando que los nombres de las columnas coincidan correctamente entre las filas:

A B [1,] 10 20 [2,] 10 20


Parece que en las versiones actuales de R (tengo la versión 3.3.0), rbind tiene la capacidad de unir dos conjuntos de datos con las mismas columnas de nombre, incluso si están en un orden diferente.

df1 <- data.frame(a = c(1:5), c = c(LETTERS[1:5]),b=c(11:15)) df2 <- data.frame(a = c(6:10), b = c(16:20),c=c(LETTERS[6:10])) rbind(df1,df2) a c b 1 1 A 11 2 2 B 12 3 3 C 13 4 4 D 14 5 5 E 15 6 6 F 16 7 7 G 17 8 8 H 18 9 9 I 19 10 10 J 20


Puedes usar match :

l <- list(row1 = setNames(1:3, c("A", "B", "C")), row2 = setNames(1:3, c("B", "C", "A")), row3 = setNames(1:3, c("C", "A", "B"))) do.call(rbind, lapply(l, function(x) x[match(names(l[[1]]), names(x))]))

El resultado:

A B C row1 1 2 3 row2 3 1 2 row3 2 3 1


Reducir es una función poderosa, pero algunas no se usan frecuentemente; Aquí hay una implementación alternativa

Esto creará un enlace donde, si hay columnas que no coinciden, se generará para ellos "NA".

rbindedFrame = Reduce(custom_rbind,listofDataframes) custom_rbind = function(x1,x2){ c1 = setdiff(colnames(x1),colnames(x2)) c2 = setdiff(colnames(x2),colnames(x1)) for(c in c2){##Adding missing columns from 2 in 1 x1[[c]]=NA } for(c in c1){##Similiarly ading missing from 1 in 2 x2[[c]]=NA } x2 = x2[colnames(x1)] rbind(x1,x2) } }


rbind funcionará si primero cambias cada elemento de l a un marco de datos:

do.call("rbind", lapply(l, function(x) data.frame(as.list(x)))) A B row1 10 20 row2 10 20


smartbind() coincidirá con los nombres de las columnas y tolerará los que faltan:

library(gtools) do.call(smartbind,l) A B row1 10 20 row2 10 20


do.call(rbind, lapply(l, function(row) row[order(names(row))]))