Cómo inicializar el dataframe vacío (lote de columnas al mismo tiempo) en R

Encontré cómo inicializar un dataframe vacío con 3 o 4 dimensiones. Es como

df <- data.frame(Date=as.Date(character()), File=character(), User=numeric(), stringsAsFactors=FALSE) 

Sin embargo, ¿cuál es la forma más efectiva de inicializar un data.frame vacío con muchos nombres de columna? me gusta

 mynames <- paste("hello", c(1:10000)) 

La manera incorrecta que probé es:

 df <- data.frame(mynames=numeric()) 

Muchas gracias de antemano

Tal vez esto –

 df <- data.frame(matrix(ncol = 10000, nrow = 0)) colnames(df) <- paste0("hello", c(1:10000)) 

Y la sugerencia de @ joran - df <- setNames(data.frame(matrix(ncol = 10000, nrow = 0)),paste0("hello", c(1:10000)))

Haría esto usando setDF (o setDT , si prefieres data.table como salida) y setnames :

 library(data.table) DF <- setnames(setDF(lapply(integer(1e4), function(...) character(0L))), paste0("hello", 1:1e4)) head(names(DF)) # [1] "hello1" "hello2" "hello3" "hello4" "hello5" "hello6" 

Ambos pasos ( setnames y setDF ) son más eficientes que las contrapartes base , ya que no se realizan copias.

Un punto de referencia:

 library(microbenchmark) microbenchmark(times = 1000, base = {df <- data.frame(matrix(ncol = 10000, nrow = 0)) colnames(df) <- paste0("hello", c(1:10000))}, DT = setnames(setDF(lapply(integer(1e4), function(...) character(0L))), paste0("hello", 1:1e4))) # Unit: milliseconds # expr min lq mean median uq max neval cld # base 26.77218 30.94223 37.30173 36.76721 37.80338 102.2379 1000 b # DT 16.68004 23.18865 30.60573 29.18421 36.03590 178.1045 1000 a