cbind a df con un df vacío (cbind.fill?)

Creo que estoy buscando un análogo de rbind.fill (en el paquete plyr de Hadley) 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 

Comprensiblemente, esto produce 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 return_df el dummy del return_df al final. Después de agregar el maniquí y ejecutar el código anterior, obtengo

  dummy ablm 1 1 1 2 hi there 44 

Entonces solo necesito deshacerme del muñeco, por ejemplo:

 > return_df[,2:ncol(return_df)] ablm 1 1 2 hi there 44 

Estoy seguro de que me falta una forma más fácil de hacer esto.

editar: Supongo que no estoy buscando un cbind.fill porque eso significaría que se crearía un valor de NA después del 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 algún lado.

EDITAR STOLE DESDE AQUÍ: LINK

Si bien, creo que la solución de Tyler es directa y la mejor aquí, simplemente la proporciono de otra manera, usando rbind.fill() que ya tenemos.

 require(plyr) # requires plyr for rbind.fill() cbind.fill <- function(...) { transpoted <- lapply(list(...),t) transpoted_dataframe <- lapply(transpoted, as.data.frame) return (data.frame(t(rbind.fill(transpoted_dataframe)))) } 

Usando rowr::cbind.fill

 rowr::cbind.fill(df1,df2,fill = NA) AB 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 NA 6 

cbind.na del paquete qpcR puede hacer eso.

  install.packages("qpcR") library(qpcR) qpcR:::cbind.na(1, 1:7) 

Sugiero una modificación de la respuesta de Tyler. Mi función permite cbind -ing de data.frames y / o matrices con vectores sin perder nombres de columna como ocurre en la solución de Tyler

 cbind.fill <- function(...){ nm <- list(...) dfdetect <- grepl("data.frame|matrix", unlist(lapply(nm, function(cl) paste(class(cl), collapse = " ") ))) # first cbind vectors together vec <- data.frame(nm[!dfdetect]) n <- max(sapply(nm[dfdetect], nrow)) vec <- data.frame(lapply(vec, function(x) rep(x, n))) if (nrow(vec) > 0) nm <- c(nm[dfdetect], list(vec)) nm <- lapply(nm, as.data.frame) do.call(cbind, lapply(nm, function (df1) rbind(df1, as.data.frame(matrix(NA, ncol = ncol(df1), nrow = n-nrow(df1), dimnames = list(NULL, names(df1))))) )) } cbind.fill(data.frame(idx = numeric()), matrix(0, ncol = 2), data.frame(qwe = 1:3, rty = letters[1:3]), type = "GOOD", mark = "K-5") # idx V1 V2 qwe rty type mark # 1 NA 0 0 1 a GOOD K-5 # 2 NA NA NA 2 b GOOD K-5 # 3 NA NA NA 3 c GOOD K-5 

Acabo de encontrar un truco que cuando queremos agregar columnas en un dataframe vacío, simplemente comstackrlo por primera vez, luego cbindlo más tarde.

  newdf <- data.frame() # add the first column newdf <- rbind(newdf,data.frame("col1"=c("row1"=1,"row2"=2))) # add the second column newdf <- cbind(newdf,data.frame("col2"=c("row1"=3,"row2"=4))) # add more columns newdf <- cbind(newdf,data.frame("col3"=c("row1"=5,"row2"=6))) # result # col1 col2 col3 #row1 1 3 5 #row2 2 4 6 

No sé por qué, pero funciona para mí.