我在R中有1900万行90列的data.frame
。我有大量的备用RAM和CPU周期。对于R,似乎在此数据框中更改单个列名称是一项非常艰巨的操作。
system.time(colnames(my.df)[1] <- "foo")
user system elapsed
356.88 16.54 373.39
为什么会这样呢?每行是否以某种方式存储列名?这是否在创建一个全新的数据框架?看来此操作应该在可忽略的时间内完成。我没有在R manual entry中看到任何明显的东西。
我正在Windows 7上运行R 7(64位)的内部版本7600,在当前的工作区中,在较小的data.frame上设置colnames根据
system.time()
花费'0'时间。编辑:我知道使用
data.table
的可能性,并且说实话,我可以等待5分钟以完成重命名,而我要去喝杯茶。我感兴趣的是发生了什么以及为什么?
最佳答案
正如一些评论者所提到的,重命名数据框列很慢,因为(取决于您的操作方式)重命名整个数据框为1到4个副本。在data.table
的?setkey
帮助页面上,这是证明我已经看到的这种行为的最好方法:
DF = data.frame(a=1:2,b=3:4) # base data.frame to demo copies
try(tracemem(DF)) # try() for non-Windows where R is
# faster without memory profiling
colnames(DF)[1] <- "A" # 4 copies of entire object
names(DF)[1] <- "A" # 3 copies of entire object
names(DF) <- c("A", "b") # 1 copy of entire object
`names<-`(DF,c("A","b")) # 1 copy of entire object
x=`names<-`(DF,c("A","b")) # still 1 copy (so not print method)
# What if DF is large, say 10GB in RAM. Copy 10GB just to change a column name?
要(开始)理解为何要用这种方式完成,您可能需要深入研究有关R-devel的一些相关讨论。这是一对:R-devel: speeding up perception和R-devel: Confused about NAMES
我对这些线程的印象派阅读是:
[<-.data.frame
或names<-
可以“撤回”并传递错误消息,而不会损坏原始对象。 (不过,正如我说的那样,这只是印象派:我完全无法按照R的内部细节进行完整的交谈!)
同样重要的是,如果您还没有看到它,这是类似于
names(z)[3] <- "c2"
“really”的工作方式:# From ?names<-
z <- "names<-"(z, "[<-"(names(z), 3, "c2"))
注意:该答案大部分来自Matthew Dowle对this other question的答案。 (我认为值得在这里放置它,并给予更多的了解,因为它与您自己的问题非常相关)。
关于r - 为什么更改具有大data.frame的列名会花费很长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11038534/