#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
.