对GROUPBY语句使用条件筛选

对GROUPBY语句使用条件筛选,r,dplyr,R,Dplyr,我有一个包含两个组的数据框架,它们有资格获得服务的年份,以及一个表示参与的标志(每个组只参与一年和一年,但不是所有组都参与) 我想按如下方式过滤数据帧: 对于参与的任何组,仅保留其参与当年和之前的行(与参与后一样,他们不再符合资格) 对于未参与的任何组,保留所有行 我知道我可以通过将数据帧分成参与组和未参与组,然后将它们重新绑定在一起来实现这一点,但我想知道是否可以在单个管道中实现这一点 library(dplyr) dat <- data.frame(grp = c("a

我有一个包含两个组的数据框架,它们有资格获得服务的年份,以及一个表示参与的标志(每个组只参与一年和一年,但不是所有组都参与)

我想按如下方式过滤数据帧:

  • 对于参与的任何组,仅保留其参与当年和之前的行(与参与后一样,他们不再符合资格)
  • 对于未参与的任何组,保留所有行
我知道我可以通过将数据帧分成参与组和未参与组,然后将它们重新绑定在一起来实现这一点,但我想知道是否可以在单个管道中实现这一点

library(dplyr)

dat <- data.frame(grp = c("a", "a", "a", "b", "b"),
                  yr = c(2017, 2018, 2019, 2017, 2018),
                  par = c(0, 1, 0, 0, 0))

## this works because group 'a' participated
dat %>% 
  group_by(grp) %>%
  filter(grp == "a") %>%
  filter(yr <= yr[par == 1])

## here i am trying to use conditional filtering but failing
dat %>% 
  group_by(grp) %>% 
  filter(yr <= case_when(max(par) == 1 ~ yr[par == 1],
                         TRUE ~ max(yr)))
库(dplyr)
dat%
分组依据(grp)%>%
过滤器(grp==“a”)%>%
过滤器(年)
分组依据(grp)%>%

过滤器(yr我认为这可能会对您有所帮助,但我希望在更大的数据集上进行测试:

library(dplyr)

dat %>%
  group_by(grp) %>%
  mutate(cumx = cumsum(cummax(par))) %>%
  filter(cumx %in% c(0,1) | all(cumx == 0)) %>%
  select(-cumx)

# A tibble: 4 x 3
# Groups:   grp [2]
  grp      yr   par
  <chr> <dbl> <dbl>
1 a      2017     0
2 a      2018     1
3 b      2017     0
4 b      2018     0
库(dplyr)
dat%>%
分组依据(grp)%>%
突变(cumx=cumsum(cummax(par)))%>%
过滤器(在%c(0,1)中的cumx%|所有(cumx==0))%>%
选择(-cumx)
#一个tibble:4x3
#组别:grp[2]
标准普尔
1A 2017 0
2 a 2018 1
3 b 2017 0
4b 2018 0

Thank you@Anoushirivan R。这对完整的数据集确实有效,我通过使用分割数据集执行相同的操作对其进行了验证。我仍然有兴趣按照原始问题中所示的思路使用条件过滤来查看潜在的解决方案,但这确实有助于实际的业务用例:)我很高兴,很高兴它起作用。我注意到了您的解决方案,但鉴于您的数据集中的情况,我们将在第一个
1
值之后消除所有参与,我意识到我们需要在参与发生的列中修改
1
后的值,以便我们可以应用某种过滤,直到该值。然而,t这是我的假设,我相信你仍然会吸引非常好的解决方案,并可能得到你想要的。无论如何,谢谢你。