gpt4 book ai didi

r - 为什么更改具有大data.frame的列名会花费很长时间?

转载 作者:行者123 更新时间:2023-12-03 11:28:17 25 4
gpt4 key购买 nike

我在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 perceptionR-devel: Confused about NAMES

我对这些线程的印象派阅读是:
  • 至少制作一份副本,以便可以在覆盖原始副本之前“试用”对它的修改。因此,如果要重新分配的值有问题,[<-.data.framenames<-可以“撤回”并传递错误消息,而不会损坏原始对象。
  • R-core的几个成员对当前的工作方式并不完全满意。一些人解释说,在某些情况下,“R会迷失方向”。卢克·蒂尔尼(Luke Tierney)表示,“过去,在某些情况下,他总是尝试过一些修改,因此总是不得不退缩”;和西蒙·厄巴内克(Simon Urbanek)暗示“也可能会出现一些问题”

  • (不过,正如我说的那样,这只是印象派:我完全无法按照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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com