12

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

我使用相当大的数据集,但从不更改它们。然而,为了方便起见,我经常选择要操作的数据子集。每次复制一个大子集的内存效率非常低,但是普通索引和subset(以及xapply()函数系列)都会创建所选数据的副本。所以我正在寻找可以克服这个问题的函数或数据结构。

一些可能适合我的需要并希望在某些 R 包中实现的方法:

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

1 回答 1

7

尝试包ref。具体来说,它的refdata类。

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

:=indata.table是一种data.table就地修改 a 的方法。 data.table与通常的 R 编程风格不同,它不是写时复制的。用户必须copy()显式调用才能复制(可能非常大)表,即使在函数内也是如此。

你是对的,没有像refdata内置的机制data.table。我明白你的意思,这将是一个不错的功能。refdata但是,应该可以在 a 上工作data.table,并且您可能会很好data.frame(但请务必使用 监视副本tracemem(DF))。

您可以尝试在包中包含( idata.frameimmutable )。data.frameplyr

于 2012-03-06T13:05:19.823 回答