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