R:选择子集而不复制
是否有一种方法可以从对象(数据帧、矩阵、向量)中选择子集,而无需复制所选数据 我处理相当大的数据集,但从不更改它们。然而,为了方便起见,我经常选择要操作的数据子集。每次复制一个大型子集的内存效率非常低,但普通索引和R:选择子集而不复制,r,immutability,subset,apply,copy-on-write,R,Immutability,Subset,Apply,Copy On Write,是否有一种方法可以从对象(数据帧、矩阵、向量)中选择子集,而无需复制所选数据 我处理相当大的数据集,但从不更改它们。然而,为了方便起见,我经常选择要操作的数据子集。每次复制一个大型子集的内存效率非常低,但普通索引和子集(因此xapply()函数族)都会创建所选数据的副本。所以我正在寻找能够克服这个问题的函数或数据结构 一些可能适合我的需要并有望在一些R包中实现的方法: 写时复制机制,即仅在添加或重写现有元素时复制的数据结构 不可变的数据结构,只需要重新创建数据结构的索引信息,而不需要重新创建其
子集
(因此xapply()
函数族)都会创建所选数据的副本。所以我正在寻找能够克服这个问题的函数或数据结构
一些可能适合我的需要并有望在一些R包中实现的方法:
- 写时复制机制,即仅在添加或重写现有元素时复制的数据结构李>
- 不可变的数据结构,只需要重新创建数据结构的索引信息,而不需要重新创建其内容(如仅通过创建包含长度的小对象和指向同一字符数组的指针,从字符串生成子字符串)李>
不创建子集的类似物xapply()
refdata
类
关于data.table
您可能缺少的是,当分组(by=
parameter)时,数据子集不会被复制,所以这很快。[从技术上讲,它们只是进入一个共享的内存区域,每个组都可以重复使用,并使用memcpy进行复制,这比C中循环的R快得多。]
:=
在数据中。表格
是就地修改数据的一种方法。表格
<代码>数据。表与通常的R编程风格不同,它不会在写入时复制。用户必须显式调用copy()
来复制(可能非常大的)表,即使在函数中也是如此
您是对的,没有像refdata
这样的机制内置在data.table
中。我明白你的意思,这将是一个很好的功能refdata
应该适用于数据表
,但您可能可以使用data.frame
(但请确保使用TraceM(DF)
)监视副本)
在包
plyr
中还有idata.frame
(不可变的data.frame
),你可以试试。我想你应该看看data.table
包(可能有人会很快出现在这里,向你提供更多细节…)数据库接口显然是你应该研究的。r中几乎所有的东西都是按承诺传递的,在需要对子集执行任何操作时,它都会成为有效的按值传递。@BenBolker:谢谢,data.table
似乎是一个不错的包,但不幸的是,在大多数情况下它不适合我的需要。特别是,data.table
有另一个索引模型,使得执行选择变得更加困难(也更加缓慢),例如data[1:50,1:10]
(即通过行和列进行选择)和许多线性代数运算。我曾考虑使用矩阵而不是数据帧来节省空间和时间,但矩阵也有其局限性,所以我也在寻找替代选项。@dwn:关于“传递值”。你的意思是R使用惰性评估吗?但它与我看到的不一致:codeDF不确定你所说的永久性是什么意思。完全有可能在函数的环境中创建一个对象,并使其在退出时自动成为可回收的垃圾。我的理解是R确实使用惰性评估。如果您想控制此过程,可以使用delayedAssign
和force
功能。我们中的大多数人并不怎么考虑它(直到它在功能评估时咬到我们为止)