基于dplyr的多个过滤操作,基于单独列中的观察数量和类型

时间:2016-07-03 17:22:42

标签: r dplyr

我有下面的df help.a,我需要使用多个过滤操作来清理它。

help.a <- data.frame(id = as.factor(c("01", "01", "01", "01", "01", "04", "04", "05", "05", "05", "05", "05", "09", "09", "09", "09", "09")),
                     episode = c(3, 3, 3, 4, 4, 3, 3, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1),
                     count = c(1, 2, 3, 4, 5, 1, 2, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5),
                     var_a = c(73, 73, 73, 73, 73, 43, 43, 80, 80, 80, 80, 80, 73, 73, 73, 73, 42))


id episode count var_a
01       3     1    73
01       3     2    73
01       3     3    73
01       4     4    73
01       4     5    73
04       3     1    43
04       3     2    43
05       2     1    80
05       2     2    80
05       2     3    80
05       2     4    80
05       3     5    80
09       1     1    73
09       1     2    73
09       1     3    73
09       1     4    73
09       1     5    42

首先:我正在尝试删除任何小于3的ID(例如,id 4)

第二:我希望删除多个剧集的观看,同时保留第一个观察到的剧集(观察到的最低集数)

第三:我想仅使用相同的var_a变量保留id观察值...如果有多个var_a个观察值,我想只保留第一个观察到的变量(例如,id 9和var_a 73)

最后,我希望我的数据集看起来类似于下面的内容:

id episode count var_a
01       3     1    73
01       3     2    73
01       3     3    73
05       2     1    80
05       2     2    80
05       2     3    80
05       2     4    80
09       1     1    73
09       1     2    73
09       1     3    73
09       1     4    73

到目前为止,我的尝试使用以下代码完成了第1部分:

help.a %>% group_by(id) %>% filter(!n() <3)

然而,我仍然坚持如何告诉dplyr首先观察episode并首先观察var.a ...任何建议都非常感谢。

1 个答案:

答案 0 :(得分:1)

我们可以在分组后使用filter中的所有三个条件来识别&#39; id&#39;

 help.a %>% 
     group_by(id) %>% filter(n() >3 & 
                             episode == first(episode) & 
                             var_a == first(var_a))    
 #       id episode count var_a
#    <fctr>   <dbl> <dbl> <dbl>
#1      01       3     1    73
#2      01       3     2    73
#3      01       3     3    73
#4      05       2     1    80
#5      05       2     2    80
#6      05       2     3    80
#7      05       2     4    80
#8      09       1     1    73
#9      09       1     2    73
#10     09       1     3    73
#11     09       1     4    73