R:选择子集而不复制

时间:2012-03-05 19:55:45

标签: r immutability subset apply copy-on-write

有没有办法从对象(数据框,矩阵,向量)中选择子集而不复制所选数据?

我使用相当大的数据集,但从不更改它们。然而,为方便起见,我选择要操作的数据子集。每次制作大型子集的副本都是内存效率低下的,但正常索引和subset(以及xapply()函数族)都会创建所选数据的副本。所以我正在寻找可以解决这个问题的功能或数据结构。

一些可能符合我需求的方法,希望在一些R包中实现:

  • 写时复制机制,即仅在添加或重写现有元素时复制的数据结构;
  • 不可变数据结构,只需要为数据结构重新创建索引信息,但不需要重新创建其内容(比如通过创建保存长度的小对象和指向其的指针来从字符串中创建子字符串char array);
  • xapply() 不会创建子集的类似物。

1 个答案:

答案 0 :(得分:7)

尝试套餐ref。具体来说,它是refdata类。

关于data.table可能缺少的是,在分组(by=参数)时,不会复制数据子集,因此速度很快。 [从技术上来说,它们只是进入一个共享的内存区域,可以为每个组重用,并使用memcpy进行复制,这比C中的循环快得多。]

:=中的

data.table是修改data.table的一种方法。 data.table偏离了通常的R编程风格,因为不是写入时复制。用户必须明确调用copy()来复制(可能非常大)的表,即使在函数内也是如此。

你是对的,refdata内置了data.table这样的机制。我明白你的意思了,这将是一个很好的功能。 refdata data.table应该适用于data.frametracemem(DF)可能会很好(但请务必使用idata.frame监控副本。)

您可以尝试在data.frame个包中添加plyr(不可变{{1}})。