cbind un marco de datos con un marco de datos vacío - cbind.fill?

Resuelto Xu Wang asked hace 54 años • 10 respuestas

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_dffinal. 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.

Xu Wang avatar Jan 01 '70 08:01 Xu Wang
Aceptado

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

Tyler Rinker avatar Nov 01 '2011 03:11 Tyler Rinker

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))))                                                                                                                          
} 
Max avatar Nov 01 '2011 05:11 Max

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
BENY avatar Jul 27 '2018 19:07 BENY