You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 23:45:00