cbind un marco de datos con un marco de datos vacío - cbind.fill?
Creo que estoy buscando un análogo de rbind.fill
(en el paquete de Hadley plyr
) para cbind
. Miré, pero no hay cbind.fill
.
Lo que quiero hacer es lo siguiente:
#set these just for this example
one_option <- TRUE
diff_option <- TRUE
return_df <- data.frame()
if (one_option) {
#do a bunch of calculations, produce a data.frame, for simplicity the following small_df
small_df <- data.frame(a=1, b=2)
return_df <- cbind(return_df,small_df)
}
if (diff_option) {
#do a bunch of calculations, produce a data.frame, for simplicity the following small2_df
small2_df <- data.frame(l="hi there", m=44)
return_df <- cbind(return_df,small2_df)
}
return_df
Es comprensible que esto produzca un error:
Error in data.frame(..., check.names = FALSE) :
arguments imply differing number of rows: 0, 1
Mi solución actual es reemplazar la línea return_df <- data.frame()
con return_df <- data.frame(dummy=1)
y luego el código funciona. Luego simplemente quito el muñeco del return_df
final. Después de agregar el muñeco y ejecutar el código anterior, obtengo
dummy a b l m
1 1 1 2 hi there 44
Entonces sólo necesito deshacerme del muñeco, por ejemplo:
> return_df[,2:ncol(return_df)]
a b l m
1 1 2 hi there 44
Estoy seguro de que me falta una manera más fácil de hacer esto.
Editar: Supongo que no estoy buscando cbind.fill porque eso significaría que se crearía un valor NA después de cbind, que no es lo que quiero.
Aquí hay un relleno cbind:
cbind.fill <- function(...){
nm <- list(...)
nm <- lapply(nm, as.matrix)
n <- max(sapply(nm, nrow))
do.call(cbind, lapply(nm, function (x)
rbind(x, matrix(, n-nrow(x), ncol(x)))))
}
Vamos a intentarlo:
x<-matrix(1:10,5,2)
y<-matrix(1:16, 4,4)
z<-matrix(1:12, 2,6)
cbind.fill(x,y)
cbind.fill(x,y,z)
cbind.fill(mtcars, mtcars[1:10,])
Creo que robé esto de alguna parte.
EDITAR ESTOLA DESDE AQUÍ: ENLACE
Si bien creo que la solución de Tyler es directa y la mejor aquí, solo proporciono la otra manera, usando rbind.fill()
la que ya tenemos.
require(plyr) # requires plyr for rbind.fill()
cbind.fill <- function(...) {
transposed <- lapply(list(...),t)
transposed_dataframe <- lapply(transposed, as.data.frame)
return (data.frame(t(rbind.fill(transposed_dataframe))))
}
Usandorowr::cbind.fill
rowr::cbind.fill(df1,df2,fill = NA)
A B
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 NA 6