R 若组有某个值,则保留组中的行,查看前一个值

R 若组有某个值,则保留组中的行,查看前一个值,r,dataframe,R,Dataframe,对于每个学生id我想检查他们在第一次考试失败后是否通过了考试 library(dplyr) data.frame(id = c(1,1,1,2,2,3,4,4), homework = c('fail', 'fail', 'pass', 'fail', 'pass', 'pass', 'pass', 'pass'), date = c('20200122', '20200124', '20200126', '20210214', '20210216', '20210303

对于每个学生
id
我想检查他们在第一次考试失败后是否通过了考试

library(dplyr)
data.frame(id = c(1,1,1,2,2,3,4,4), homework = c('fail', 'fail', 'pass', 'fail', 'pass', 'pass', 'pass', 'pass'), 
           date = c('20200122', '20200124', '20200126', '20210214', '20210216', '20210303', '20201203', '20201205')) %>%
  mutate(date = as.Date(date, '%Y%m%d'))

# id homework       date
# 1  1     fail 2020-01-22
# 2  1     fail 2020-01-24
# 3  1     pass 2020-01-26
# 4  2     fail 2021-02-14
# 5  2     pass 2021-02-16
# 6  3     pass 2021-03-03
# 7  4     pass 2020-12-03
# 8  4     pass 2020-12-05
如果是,我想保留该学生的行:

# id homework       date
# 1  1     fail 2020-01-22
# 2  1     fail 2020-01-24
# 3  1     pass 2020-01-26
# 4  2     fail 2021-02-14
# 5  2     pass 2021-02-16

我似乎不知道如何“到达”团队中上/下一行以便进行检查。有人有什么建议吗?提前感谢:)

您可以使用
dplyr::lag
dplyr::lead
分别访问当前行之前和之后的行

df %>%
  group_by(id) %>%
  mutate(
    passed_after_fail = homework == "pass" & lag(homework) == "fail"
  ) %>%
  filter(any(passed_after_fail))

基本上,每个组都必须同时包含“失败”和“通过”。使用
filter()
的选项可以如下所示

library(dplyr)

df %>%
  group_by(id) %>%
  filter('fail' %in% homework &
         'pass' %in% homework)

# # A tibble: 5 x 3
# # Groups:   id [2]
#      id homework date      
#   <dbl> <chr>    <date>    
# 1     1 fail     2020-01-22
# 2     1 fail     2020-01-24
# 3     1 pass     2020-01-26
# 4     2 fail     2021-02-14
# 5     2 pass     2021-02-16
库(dplyr)
df%>%
分组依据(id)%>%
筛选器('在%1中失败“%1”)&
'在%1中通过“%1”)
##tibble:5 x 3
##组:id[2]
#家庭作业日期
#            
#1失败2020-01-22
#2 1失败2020-01-24
#3.1通过2020-01-26
#2021-02-14年4月2日失败
#5 2通过2021-02-16