2013-12-10 20 views
26

我发现如何初始化具有3或4维的空数据帧。这就像如何在R中初始化空数据帧(大量列同时)

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()) 

非常感谢事先

+0

相关:[*创建一个空data.frame *](http://stackoverflow.com/questions/10689055/create-an-empty-data-frame) – Jaap

回答

29

也许这 -

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)))

+0

耶。这听起来很正确。我想我需要的是一个矩阵,而不是一个data.frame。谢谢 –

+5

如果你真的想把它强制为一行,你可以使用'setNames'。 – joran

+0

@WilmerEHenaoH,考虑接受答案,如果它解决了这个问题。乔兰,好主意,更新了答案。 – TheComeOnMan

0

我会做到这一点使用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" 

两个步骤(setnamessetDF)比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