如何用tidyverse筛选出三次考试均未通过的学生数据
筛选三次考试均未通过学生的正确方法
现有学生考试尝试数据,通过tidyverse构建的数据框df如下:
library(tidyverse) id <- c(1, 1, 2, 2, 3, 3, 1, 1, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4) status <- c("start", "fail", "start", "pass", "start", "fail", "start", "pass", "start", "fail", "start", "fail", "start", "fail", "start", "fail", "start", "pass") df <- data.frame(id, status)
需求是筛选出三次考试均未通过的学生,但原有筛选代码错误地包含了最终通过考试的id=4学生:
df |> group_by(id) |> filter(n() == 6 & status == "fail")
正确筛选方法
核心逻辑是:筛选出从未出现过"pass"状态且**总共有6条记录(对应三次完整尝试)**的学生组,再按需保留单条记录:
df |> group_by(id) |> # 两个条件:组内无pass记录,且总共有6条数据(三次尝试) filter(!any(status == "pass") & n() == 6) |> # 去重保留单条该学生的fail记录 distinct(id, .keep_all = TRUE)
执行后得到符合需求的输出:
id status <dbl> <chr> 1 3 fail
原代码问题说明
原代码仅筛选了组内有6条数据且当前行是fail的记录,但未排除那些组内存在"pass"状态的学生(比如id=4),因此会错误包含不符合要求的记录。
内容的提问来源于stack exchange,提问作者JontroPothon
相关产品推荐
相关产品推荐

