【发布时间】:2019-06-25 17:00:23
【问题描述】:
我有一个这样结构的数据表,我在其中跟踪流程。如果发生了事件,那么我在当天将其标记为 1,否则标记为 0。我在这里展示了前几个事件,但真正的数据集有很多行(超过 500,000 行),有很多唯一的进程 ID。
process_id date event
00001 01/01/12 0
00002 01/01/12 1
00003 01/01/12 0
... ... ...
00001 01/01/19 1
00002 01/01/19 0
00003 01/01/19 1
我现在想知道的是对于每个观察(行),如果该 process_id 在去年(不包括当前日期)发生了事件,并添加一个表示标志的列。假设该行
00002 10/01/18 1
出现在表中,那么输出表可能看起来像
process_id date event previousEvent
00001 01/01/12 0 NA
00002 01/01/12 1 NA
00003 01/01/12 0 NA
... ... ... ...
00001 01/01/19 1 0
00002 01/01/19 0 1
00003 01/01/19 1 0
我目前的做法是使用dplyr 工具包进行过滤,但是我认为由于它不是矢量化方法,因此它可能不是最有效的做事方式。将doSNOW 包用于并行化方法,程序的主循环如下所示。它只是计算事件发生的次数,以确定事件是否在去年发生。但是,即使这种方法也需要很长时间(我的机器上这么多行大约需要一个小时)
result <- foreach(i = 1:nrow(data),
.options.snow=opts, .combine='rbind', .packages = 'dplyr')
%dopar%
{
d <- nrow(data%>%
filter(process_id %in% data[i,]$process_id ) %>%
filter(date>= data[i,]$LastYearDate) %>%
filter(date< data[i,]$date) %>%
filter(event > 0))
return(ifelse(d,1,0))
}
有没有更好的方法?我对 R 和过滤表的许多技术非常陌生。
【问题讨论】:
标签: r dplyr data.table snow