Подтвердить что ты не робот

Как инициализировать пустой фрейм данных (количество столбцов одновременно) в R

Я нашел, как инициализировать пустой фрейм данных с 3 или 4 измерениями. Это нравится

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

Однако, самый эффективный способ инициализации пустого файла data.frame с большим количеством имен столбцов. как

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

Неправильно, я пытался:

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

Большое спасибо заранее

4b9b3361

Ответ 1

Может быть, это -

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

И предложение @joran - df <- setNames(data.frame(matrix(ncol = 10000, nrow = 0)),paste0("hello", c(1:10000)))

Ответ 2

Я бы сделал это с помощью setDF (или setDT, если вы предпочитаете data.table в качестве вывода) и 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"

Оба шага (setnames и setDF) более эффективны, чем копии base, поскольку копии не выполняются.

Тест:

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