r фильтровать фрейм данных group_by и находить cumusm

#r #filter #group-by #cumsum

#r #Фильтр #группировать по #cumsum

Вопрос:

У меня есть 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» ),
а затем найти cumsum появления «AAA» по группе.
В примере первый элемент «BBB» в группе id = 4 удаляется, поскольку он появляется перед «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)
  

Ответ №1:

Вы можете попробовать следующее с dplyr помощью library :

 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 .