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

标签 r dataframe data.table

我在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/

    相关文章:

    r - 将共现数据帧转换为方阵

    r - 使用 .SDcols 对 r 中的 data.table 中的列值求和

    从R中列表列的所有列表中删除特定数字

    r - 对具有相似名称的多组列使用相同的 mutate

    r - 有没有办法自动按 data.table 中的(几乎)所有列进行分组

    python - 如何过滤数据框中 2019、2020 和 2021 年的列值?

    python - Pandas:包含元组的熔化列

    pandas - 如何在matplotlib pandas中将两个文件的两个条形图组合在一张图中

    r - 查找 data.table 中的列是否有多个类

    r - 如何按行在 data.table 中添加时间序列对象 (ts)?