R中ave函数的问题:错误“无法分配大小为419 kb的向量”。

时间:2017-10-19 19:18:06

标签: r memory-management aggregate plyr

对于长格式的数据,我试图生成一个1:事件长度的序列来计算ID中每个事件的长度(时间),如下所示:

ID   Event  Time
1    1      1
1    1      2
1    1      3 
1    2      1
1    2      2
1    2      3

使用ave似乎很简单:

time <- ave(event, ID, FUN = sequence)

代码在1000行的数据集中正常工作。但是,在134000行的完整数据集和3mb的文件大小上,我的计算机几乎冻结了大约40分钟,我得到错误“无法分配大小为419kb的向量”。我正在运行64位版本的R,我的机器有4 GB的RAM。文件大小似乎不是特别大,任务不是太繁琐,所以我认为这是ave的一个问题,我尝试使用聚合,然后ddply来自plyr包,并尝试相同的问题。我还尝试使用8 gb RAM的笔记本电脑,增加R中的内存限制,并清除所有其他应用程序以释放内存。这是一项内存密集型任务,我正试图参与竞争吗?还有更有效的替代方案吗?

1 个答案:

答案 0 :(得分:0)

sequence用作FUN可能无法正常工作。例如,

sequence(c(6, 5))
#[1] 1 2 3 4 5 6 1 2 3 4 5

seq_along(c(6, 5))
#[1] 1 2

请注意,在前一种情况下,它返回一个长度为11的向量。

ave期望输出vector与初始length

vector相同

因此,基于此,最好在seq_along

中使用FUN作为ave参数
df1$Time <- with(df1, ave(Event, Event, ID, FUN = seq_along))

更快的选项是使用data.table,我们在按“ID”和“事件”分组后分配(:=)序列

library(data.table)
setDT(df1)[, Time := seq_len(.N), .(ID, Event)]