【发布时间】:2012-03-23 07:16:28
【问题描述】:
有没有办法从对象(数据框、矩阵、向量)选择子集而不复制所选数据?
我使用非常大的数据集,但从不更改它们。然而,为了方便起见,我经常选择要操作的数据子集。每次复制一个大子集的内存效率非常低,但是普通索引和subset(以及xapply() 系列函数)都会创建所选数据的副本。所以我正在寻找可以克服这个问题的函数或数据结构。
一些可能适合我的需要并希望在某些 R 包中实现的方法:
- copy-on-write 机制,即仅在您添加或重写现有元素时复制的数据结构;
- 不可变数据结构,只需要为数据结构重新创建索引信息,而不是它的内容(例如通过只创建包含长度的小对象和指向同一 char 数组的指针来从字符串中创建子字符串) ;
-
xapply()不创建子集的类似物。
【问题讨论】:
-
我认为你应该看看
data.table包(估计很快就会有人出现在这里给你更多细节......) -
数据库接口显然是您应该研究的。 r 中几乎所有的东西都是按承诺传递的,在需要对子集做任何事情的那一刻,它实际上变成了按值传递。
-
@BenBolker:谢谢,
data.table似乎是一个不错的包,但不幸的是它在大多数情况下不符合我的需求。特别是,data.table有另一个索引模型,这使得执行像data[1:50, 1:10](即同时选择 - 行和列)和许多线性代数运算这样的选择变得更加困难(并且速度更慢)。我正在考虑使用矩阵而不是我的数据框来节省空间和时间,但矩阵也有其局限性,所以我也在寻找替代方案。 -
@DWin:关于“按值传递”。你的意思是 R 使用惰性求值?但它与我看到的不对应:代码
DF <- data[1:10000, ]大约需要 30 秒,这比创建 promise 对象所需的时间要长得多。这也意味着数据结构必须是永久性的才能不破坏语言语义,但事实并非如此。请你解释一下好吗?我肯定想念一些东西。 (让我知道是否值得将其作为单独的问题发布。) -
不确定您所说的永久是什么意思。在函数的环境中创建一个对象并让它在退出时自动成为垃圾回收是完全可能的。我的理解是 R 确实使用惰性求值。如果您想对 this.process 进行一些控制,可以使用
delayedAssign和force函数。我们大多数人都没有考虑太多(直到它在函数评估期间咬我们。)
标签: r immutability subset apply copy-on-write