Come inizializzare il frame di dati vuoto (molte colonne allo stesso tempo) in R

Ho trovato come inizializzare un frame di dati vuoto con 3 o 4 dimensioni. È come

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

Tuttavia, qual è il modo più efficace per inizializzare un data.frame vuoto con molti nomi di colonne. piace

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

Il modo sbagliato che ho provato è:

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

Grazie mille in anticipo

Forse questo –

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

E il suggerimento di @ joran - df <- setNames(data.frame(matrix(ncol = 10000, nrow = 0)),paste0("hello", c(1:10000)))

Lo farei usando setDF (o setDT , se preferisci data.table come output) e 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" 

Entrambi i passaggi ( setnames e setDF ) sono più efficienti delle controparti di base , poiché non vengono eseguite copie.

Un punto di riferimento:

 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