varias superponer studio lineas insertar graficos graficas filas eliminar data columna r rbind

superponer - La forma más simple de hacer que rbind ignore los nombres de las columnas



superponer graficas en r (2)

Es posible que encuentre setNames útil aquí ...

rbind(df, setNames(rev(df), names(df))) # x y #1 1 3 #2 2 4 #3 3 1 #4 4 2

Sospecho que tu caso de uso real es algo más complejo. Por supuesto, puede reordenar columnas en el primer argumento de setNames como desee, solo use names(df) en el segundo argumento, de modo que los nombres de las columnas reordenadas coincidan con el original.

Esto surgió solo en una respuesta a otra pregunta aquí. Cuando se rbind dos marcos de datos, coincide con las columnas por nombre en lugar de por índice, lo que puede generar un comportamiento inesperado:

> df<-data.frame(x=1:2,y=3:4) > df x y 1 1 3 2 2 4 > rbind(df,df[,2:1]) x y 1 1 3 2 2 4 3 1 3 4 2 4

Por supuesto, hay soluciones. Por ejemplo:

rbind(df,rename(df[,2:1],names(df))) data.frame(rbind(as.matrix(df),as.matrix(df[,2:1])))

En edición: rename el rename del paquete plyr realidad no funciona de esta manera (aunque pensé que lo tenía funcionando cuando originalmente escribí esto ...). La forma de hacerlo mediante el cambio de nombre es usar la solución de SimonO101:

rbind(df,setNames(df[,2:1],names(df)))

Además, quizás sorprendentemente,

data.frame(rbindlist(list(df,df[,2:1])))

funciona por índice (y si no nos importa una tabla de datos, entonces es bastante conciso), así que esta es una diferencia entre do.call(rbind) .

La pregunta es, ¿cuál es la forma más concisa de rbind dos marcos de datos donde los nombres no coinciden? Sé que esto parece trivial, pero este tipo de cosas puede terminar en un código desordenado. Y no quiero tener que escribir una nueva función llamada rbindByIndex . Idealmente sería algo así como rbind(df,df[,2:1],byIndex=T) .


Esto parece bastante fácil:

mapply(c,df,df[,2:1]) x y [1,] 1 3 [2,] 2 4 [3,] 3 1 [4,] 4 2

Para este caso simple, sin embargo, debe volver a convertirlo en un marco de datos (porque mapply simplifica a una matriz):

as.data.frame(mapply(c,df,df[,2:1])) x y 1 1 3 2 2 4 3 3 1 4 4 2

Nota importante 1 : parece haber una desventaja de la coerción de tipo cuando su dataframe contiene vectores de diferentes tipos:

df<-data.frame(x=1:2,y=3:4,z=c(''a'',''b'')) mapply(c,df,df[,c(2:1,3)]) x y z [1,] 1 3 2 [2,] 2 4 1 [3,] 3 1 2 [4,] 4 2 1

Nota importante 2 : También es terrible si tienes factores.

df<-data.frame(x=factor(1:2),y=factor(3:4)) mapply(c,df[,1:2],df[,2:1]) x y [1,] 1 1 [2,] 2 2 [3,] 1 1 [4,] 2 2

Entonces, mientras tengas todos los datos numéricos, está bien.