如何用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
相关产品推荐
相关产品推荐

