r 过滤数据框 group_by,并找到 cumusm

r filter dataframe group_by, and find cumusm

我有一个df的方式如下

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

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

输出看起来像

id =  c(  1,    1,    3,    4,    4)
val = c("AAA","BBB","AAA","AAA","CCC")
cs =  c(  1,     1,    2,    3,    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

我们 select 每个 id 值后的所有行 "AAA"