按 R 中的长格式规范过滤观察结果

Filter observations by specifications in long form in R

我的数据是这样的

id<-c(100,100,100,105,105,105,105,105,112,112,112,112,112,112)
age<-c(17,21,25,21,22,27,32,39,20,27,28,30,31,35)
status<-c('clear','warning','offend','clear','warning','warning','warning','offend','clear','warning','offend','clear','warning','offend')

mydata<-data.frame(id,age,status)

我想过滤那些仅在一次警告后第一个冒犯的人的行,这应该是 id 100 在 25 岁时,id 112 在 28 岁时。

我的尝试如下

mydata %>% 
  group_by(id) %>% 
  filter(!(duplicated(status) & status=='warning')) %>% 
  slice(match('offend',status))

这也给了我 39 岁的 id 105,这是不正确的,因为 s/he 之前不止一次被警告过。

我试图创建一个虚拟对象,例如 group_by(id,status) %>% mutate(dummy=1:n()) 以考虑某人被警告的次数,然后如果他们只被警告过一次,但那是行不通的,因为那不会给我 id 112,他被警告过,被冒犯了(应该捕获这一行)然后再次被警告和冒犯,这给了这个人一个价值2 下假人。

这个有用吗:

mydata %>% group_by(id) %>% 
  mutate(flag = cumsum(status == 'warning')) %>% 
    filter(status == 'offend' & lag(status) == 'warning' & flag == 1) %>% select(-flag)
# A tibble: 2 x 3
# Groups:   id [2]
     id   age status
  <dbl> <dbl> <chr> 
1   100    25 offend
2   112    28 offend