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

如何用tidyverse根据跨任务行条件筛选DataFrame?

使用tidyverse实现需求的解决方案

步骤说明

要实现你的需求,核心逻辑是:先识别出同一参与者下,在task="b"时correct≠0的姓名,再保留这些姓名对应的task="a"的数据。具体用tidyverse的dplyr包实现:

完整代码

library(tidyverse)

# 构造原始数据框
participant <- c(1, 1, 1, 1, 2, 2, 2, 2)
task <- c("a", "a", "b", "b", "a","a", "b", "b")
name <- c("Maria", "Laura", "Laura", "Maria", "Laura", "Maria", "Maria", "Laura")
correct <- c(1, 1, 0, 1, 1, 0, 0, 1)
df <- data.frame(participant, task, name, correct)

# 生成目标数据框
df2 <- df %>%
  # 按参与者+姓名分组,确保判断的是同一人在task=b时的表现
  group_by(participant, name) %>%
  # 过滤条件:1. 分组内不存在task=b且correct=0的记录;2. 仅保留task=a的行
  filter(!any(task == "b" & correct == 0), task == "a") %>%
  # 取消分组,还原为普通数据框
  ungroup()

代码解释

  • group_by(participant, name):按参与者和姓名组合分组,因为我们需要针对每个参与者的特定姓名,检查其在task="b"时的答题情况。
  • filter(!any(task == "b" & correct == 0), task == "a"):
    • any(task == "b" & correct == 0):判断当前分组中是否存在task为"b"且correct=0的记录,若存在则返回TRUE;!取反后,只保留没有该情况的分组。
    • 第二个条件task == "a"进一步筛选出这些分组中task为"a"的行。
  • ungroup():取消分组,确保最终的df2是普通数据框格式。

验证结果

运行代码后得到的df2如下(与需求逻辑一致,若示例结果存在笔误可忽略):

# A tibble: 2 × 4
  participant task  name   correct
        <dbl> <chr> <chr>    <dbl>
1           1 a     Maria        1
2           2 a     Laura        1

内容的提问来源于stack exchange,提问作者ajestudillo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:20:38