r - 修改大 R data.frame 时内存不足

标签 r dataframe

我有一个大约 900MB 内存的大数据框。然后我尝试像这样修改它:

dataframe[[17]][37544]=0 

似乎使 R 使用超过 3G 的内存,并且 R 提示“错误:无法分配大小为 3.0 Mb 的向量”,(我在 32 位机器上。)

我发现这种方式更好:
dataframe[37544, 17]=0

但是 R 的占用空间仍然增加了一倍,并且该命令需要相当长的时间才能运行。

从 C/C++ 背景来看,我对这种行为感到非常困惑。我想像 dataframe[37544, 17]=0应该在不消耗任何额外内存的情况下瞬间完成(只需修改一个单元格)。 R 对我发布的那些命令做了什么?那么在不使内存占用加倍的情况下修改数据框中的某些元素的正确方法是什么?

非常感谢你的帮助!

最佳答案

跟进 Joran 的建议 data.table ,这里有一些链接。您的对象(大小为 900MB)即使在 32 位 R 中也可以在 RAM 中进行管理,根本没有副本。

When should I use the := operator in data.table?

Why has data.table defined := rather than overloading <-?

另外, data.table v1.8.0(尚未在 CRAN 上,但在 R-Forge 上稳定)具有 set()提供更快分配元素的函数,与分配给 matrix 的速度一样快(例如,适合在循环内使用)。见 latest NEWS有关更多详细信息和示例。另见 ?":="链接自 ?data.table .

而且,这里是 12 questions在 Stack Overflow 上使用 data.table包含“引用”一词的标签。

为了完整性:

require(data.table)
DT = as.data.table(dataframe)
# say column name 17 is 'Q' (i.e. LETTERS[17])
# then any of the following :

DT[37544, Q:=0]                # using column name (often preferred)

DT[37544, 17:=0, with=FALSE]   # using column number

col = "Q"
DT[37544, col:=0, with=FALSE]  # variable holding name

col = 17
DT[37544, col:=0, with=FALSE]  # variable holding number

set(DT,37544L,17L,0)           # using set(i,j,value) in v1.8.0
set(DT,37544L,"Q",0)

但是,请查看链接的问题和包的文档以了解如何 :=比这个简单的例子更通用;例如,结合 :=i 中进行二分查找加入。

关于r - 修改大 R data.frame 时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9508118/

相关文章:

r - 在 R 中搜索数据框中的两列

r - R 中跨列行值的比较

R - 在数据框中查找字符串的每个位置

R 当前时间(以毫秒为单位)

r - ctree()-如何获取每个终端节点的拆分条件列表?

R:幂函数拟合 - 错误修复等

r - 如何为数据框中的每一行设置编号名称?

r - 合并列以删除 NA 但优先考虑特定替换

r - ggplot2:如何将变量的值分配给ggplot标题

r - 创建一个新变量,它是一个变量以另外两个变量为条件的平均值(并维护数据集中的所有其他变量)