首页 > 解决方案 > 过滤分组变量维护序列

问题描述

我有一个数据框:

df <- data.frame(
        Group=c('A','A','A','A','B','B','B','B'),
        Activity = c('EOSP','NOR','EOSP','COSP','NOR','EOSP','WL','NOR'),
        TimeLine=c(1,2,3,4,1,2,3,4)
      )

我只想过滤每个组两个活动,并按照我过滤的顺序。例如,我只在寻找活动EOSPNOR但也在寻找顺序。这段代码:

df %>% group_by(Group) %>% 
        filter(all(c('EOSP','NOR') %in% Activity) & Activity %in% c('EOSP','NOR'))

结果是:

# A tibble: 6 x 3
# Groups:   Group [2]
  Group Activity TimeLine
  <fct> <fct>       <dbl>
1 A     EOSP            1
2 A     NOR             2
3 A     EOSP            3
4 B     NOR             1
5 B     EOSP            2
6 B     NOR             4

我不希望第 3 行EOSP出现在NOR. 同样对于 B 组,我不想要第 4 行,就像NOR之前发生的那样EOSP。我如何实现这一目标?

标签: rdplyr

解决方案


这是包的一个选项:您自己加入df,将其子集以仅保留EOSP Activity并按组计算最小值TimeLine,然后您可以仅保留TimeLine大于或等于 this的行TimeLine,以确保NOR仅保留如果有EOSP之前。然后,如果您只想每组保留 2 个活动,则删除重复的组和活动:

df[df[Activity=="EOSP", min(TimeLine), by=Group], on="Group"][Activity %in% c("NOR", "EOSP") & TimeLine >= V1][!duplicated(paste(Group, Activity))]

#   Group Activity TimeLine V1
#1:     A     EOSP        1  1
#2:     A      NOR        2  1
#3:     B     EOSP        2  2
#4:     B      NOR        4  2

推荐阅读