Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用R中每个组的条件筛选组_R_Dplyr - Fatal编程技术网

使用R中每个组的条件筛选组

使用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

我有以下两个用户事件数据帧:

data.favorite用户当时喜欢的项目

data.view用户当时查看的项目

我现在只想保留在该用户喜欢该项目之后发生的data.view事件。例如,data.view的第1行将被删除,因为用户1喜欢2处的项目A。但是,时间3的视图事件将保留,因为此时用户已经喜欢该项目。因此,本例的结果应如下所示:

           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
data.view %>%
left_join(data.favorite, by=c("user", "item"), suffix=c("_view","_fav")) %>%
filter(time_view > time_fav)

埃塔:那是在我得知亨里克在上述评论中提到的“非平等加入”之前。这些听起来很酷。

查找“data.table non-equi-join”,我相信您会在某处和其他地方找到很好的相关示例。例如,d.fav[d.view,on=.user,item,timelibrary(tidyverse) data.favorite %>% bind_rows(data.view) %>% arrange(user, item, time) %>% group_by(user, item) %>% mutate(sequence = cumsum(event=="fav"))
    user  item  time event sequence
1      1     A     1  view        0
2      1     A     2   fav        1
3      1     A     3  view        1
4      1     B     4  view        0
5      1     B     5  view        0
6      1     B     6   fav        1
7      1     B     7  view        1
8      1     C     8  view        0
9      2     D     9   fav        1
10     3     A     2  view        0
11     3     A     5   fav        1
12     3     A     9  view        1
data.favorite %>% bind_rows(data.view) %>%
  arrange(user, item, time) %>%
  group_by(user, item) %>%
  filter(cumsum(event=="fav") >= 1, event=="view")
   user  item  time event
1     1     A     3  view
2     1     B     7  view
3     3     A     9  view
data.view %>%
left_join(data.favorite, by=c("user", "item"), suffix=c("_view","_fav")) %>%
filter(time_view > time_fav)