r过滤dataframe group_by,并找到cumusm

问题描述

我通过以下方式拥有df

id = c(1,1,2,3,4,4)
val = c("AAA","BBB","CCC","AAA","CCC")
df = data.frame(id= id,val=val)

我要删除至少一个不包含给定字符串的任何组(在此为“ AAA”), 然后按组查找“ AAA”的出现总数。 在该示例中,组id = 4中的第一个元素“ BBB”被删除,因为它出现在“ AAA”之前。

输出看起来像

id =  c(  1,"CCC")
cs =  c(  1,3)
df = data.frame(id= id,val=val,cs)

解决方法

您可以使用dplyr库尝试以下操作:

library(dplyr)
df %>%
  group_by(id) %>%
  filter(if(any(val == 'AAA')) row_number() >= match('AAA',val) else FALSE) %>%
  mutate(cs = cur_group_id())
  #For dplyr < 1.0.0
  #ungroup %>% mutate(cs = match(id,unique(id)))

#     id val      cs
#  <dbl> <chr> <int>
#1     1 AAA       1
#2     1 BBB       1
#3     3 AAA       2
#4     4 AAA       3
#5     4 CCC       3

我们为每个"AAA"选择id值之后的所有行。