对于长格式的数据,我试图生成一个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中的内存限制,并清除所有其他应用程序以释放内存。这是一项内存密集型任务,我正试图参与竞争吗?还有更有效的替代方案吗?
答案 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)]