varias superponer studio pastel graficos grafico graficas r matrix dataframe append rbind

superponer - Cómo anexar una fila de grupo en el marco de datos



superponer graficas en r (9)

Aquí hay un método base R con rbind , rep y setNames :

rbind(dat, setNames(data.frame(rep(dat1, ncol(dat))), names(dat))) A B C 1 1 2 3 2 5 7 9 3 1 1 1 4 2 2 2 5 3 3 3 6 4 4 4

Edición: resulta que data.frame no es necesario:

rbind(dat, setNames(rep(dat1, ncol(dat)), names(dat)))

trabajará.

datos

dat <- structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A", "B", "C"), class = "data.frame", row.names = c(NA, -2L)) dat1 <- structure(list(A = 1:4), .Names = "A", row.names = c(NA, -4L), class = "data.frame")

Tengo este df1:

A B C 1 2 3 5 7 9

donde ABC son nombres de columnas.

Tengo otro df2 con una columna:

A 1 2 3 4

Me gustaría añadir df2 para cada columna de df1, creando este último marco de datos:

A B C 1 2 3 5 7 9 1 1 1 2 2 2 3 3 3 4 4 4

¿Es posible hacer lo?


Datos:

df1 <- data.frame(A=c(1,5), B=c(2,7), C=c(3,9)) df2 <- data.frame(A=c(1,2,3,4))

Solución:

df2 <- matrix(rep(df2$A, ncol(df1)), ncol=ncol(df1)) colnames(df2) <- colnames(df1) rbind(df1,df2)

Resultado:

A B C 1 1 2 3 2 5 7 9 3 1 1 1 4 2 2 2 5 3 3 3 6 4 4 4


En aras de la integridad, aquí está el enfoque data.table que no requiere manejar nombres de columna:

library(data.table) setDT(df1)[, lapply(.SD, c, df2$A)]

A B C 1: 1 2 3 2: 5 7 9 3: 1 1 1 4: 2 2 2 5: 3 3 3 6: 4 4 4

Tenga en cuenta que el OP ha descrito que df2 consiste solo en una columna.

También hay una versión base R de este enfoque:

data.frame(lapply(df1, c, df2$A))

A B C 1 1 2 3 2 5 7 9 3 1 1 1 4 2 2 2 5 3 3 3 6 4 4 4

Esto es similar al d.b''s pero no es necesario tratar con los nombres de columna.


Me encanta R, aquí hay otra solución Base R pero con mapply :

data.frame(mapply(c, df1, df2))

Resultado:

A B C 1 1 2 3 2 5 7 9 3 1 1 1 4 2 2 2 5 3 3 3 6 4 4 4

Nota:

No hay necesidad de lidiar con nombres como casi todas las otras soluciones ... La clave de por qué esto funciona es que " mapply llama a FUN para los valores de ... [cada elemento] (recirculado a la longitud del más largo ... . [elemento] "(Ver ?mapply ). En otras palabras, df2$A se recicla a todas las columnas que tiene df1 .

Datos:

df1 = structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A", "B", "C"), class = "data.frame", row.names = c(NA, -2L)) df2 = structure(list(A = 1:4), .Names = "A", row.names = c(NA, -4L), class = "data.frame")


Podemos replicar df2 para el número de columnas de df1 , sin nombre, y luego rbind .

rbind(df1, unname(rep(df2, ncol(df1)))) # A B C # 1 1 2 3 # 2 5 7 9 # 3 1 1 1 # 4 2 2 2 # 5 3 3 3 # 6 4 4 4

Datos:

df1 <- structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A", "B", "C"), class = "data.frame", row.names = c(NA, -2L)) df2 <- structure(list(A = 1:4), .Names = "A", row.names = c(NA, -4L), class = "data.frame")


Podemos utilizar métodos base R

rbind(df1, setNames(as.data.frame(do.call(cbind, rep(list(df2$A), 3))), names(df1))) # A B C #1 1 2 3 #2 5 7 9 #3 1 1 1 #4 2 2 2 #5 3 3 3 #6 4 4 4

datos

df1 <- structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A", "B", "C"), class = "data.frame", row.names = c(NA, -2L)) df2 <- structure(list(A = 1:4), .Names = "A", class = "data.frame", row.names = c(NA, -4L))


Por analogía con la excelente respuesta Base R de @ useR, aquí hay una solución tidyverse :

library(purrr) map2_df(df1, df2, c)

A B C 1 1 2 3 2 5 7 9 3 1 1 1 4 2 2 2 5 3 3 3 6 4 4 4

Aquí hay algunas otras opciones (menos deseables) de la primera vez que respondí esta pregunta.

library(dplyr) bind_rows(df1, df2 %>% mutate(B=A, C=A))

O, si queremos obtener dinámicamente el número de columnas y sus nombres de df1:

bind_rows(df1, df2[,rep(1,ncol(df1))] %>% setNames(names(df1)))

Y un método más de Base R:

rbind(df1, setNames(df2[,rep(1,ncol(df1))], names(df1)))


Una solución de purrr , que utiliza map_dfc para recorrer todas las columnas en df1 para combinar todos los elementos con df2$A

library(purrr) map_dfc(df1, ~c(., df2$A)) # A tibble: 6 x 3 A B C <int> <int> <int> 1 1 2 3 2 5 7 9 3 1 1 1 4 2 2 2 5 3 3 3 6 4 4 4

Datos

df1 <- structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A", "B", "C"), class = "data.frame", row.names = c(NA, -2L)) df2 <- structure(list(A = 1:4), .Names = "A", class = "data.frame", row.names = c(NA, -4L))


data.frame(sapply(df1, c, unlist(df2)), row.names = NULL) # A B C #1 1 2 3 #2 5 7 9 #3 1 1 1 #4 2 2 2 #5 3 3 3 #6 4 4 4

DATOS

df1 = structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A", "B", "C"), class = "data.frame", row.names = c(NA, -2L)) df2 = structure(list(A = 1:4), .Names = "A", class = "data.frame", row.names = c(NA, -4L))