使用R中每个组的条件筛选组
我有以下两个用户事件数据帧: data.favorite用户当时喜欢的项目 data.view用户当时查看的项目 我现在只想保留在该用户喜欢该项目之后发生的data.view事件。例如,data.view的第1行将被删除,因为用户1喜欢2处的项目A。但是,时间3的视图事件将保留,因为此时用户已经喜欢该项目。因此,本例的结果应如下所示:使用R中每个组的条件筛选组,r,dplyr,R,Dplyr,我有以下两个用户事件数据帧: data.favorite用户当时喜欢的项目 data.view用户当时查看的项目 我现在只想保留在该用户喜欢该项目之后发生的data.view事件。例如,data.view的第1行将被删除,因为用户1喜欢2处的项目A。但是,时间3的视图事件将保留,因为此时用户已经喜欢该项目。因此,本例的结果应如下所示: user item time event 1 1 A 3 view 2
user item time event
1 1 A 3 view
2 1 B 7 view
3 3 A 9 view
我目前的方法太慢了。我将自定义函数应用于data.view:
wasFav = function(u, i, t) {
favs = data.favorite %>% filter(user == u, item == i, time < t)
return(nrow(favs) > 0)
}
有什么更快的方法吗?使用匹配data.frames称为data.view和data.fav:
#Find indices of matching users&items
Indices <- match(paste(data.view$user, data.view$item), paste(data.fav$user, data.fav$item))
#add corresponding fav time to data.view:
data.view$favtime <- data.fav$time[Indices]
#only keep rows in which time is greater than fav.time:
data.view <- data.view[data.view$time>data.view$favtime & !is.na(data.view$favtime),]
我们可以组合这两个数据帧,按用户和项目分组,然后在data.view中只保留fav之后发生的事件行。我们使用cumsum统计fav实例,并从fav的第一个实例开始选择所有行 第一组代码用于演示,因此您可以看到该方法正在执行的操作。第二组代码直接进行过滤
library(tidyverse)
data.favorite %>% bind_rows(data.view) %>%
arrange(user, item, time) %>%
group_by(user, item) %>%
mutate(sequence = cumsum(event=="fav"))
我将按用户和项目加入,假设每个用户项目对在data.favorite中只出现一次。然后,您可以直接将viewtime与某个项目的收藏时间进行比较,并放弃time\u viewed