R中如何按条件删除行,保留每位受试者符合要求的最高block数据
解决方案
你正在使用的dplyr包即可直接实现该需求,无需额外安装其他依赖,核心逻辑为:先按受试者、任务块分组统计正确作答数量,过滤掉不足2条正确记录的任务块后,取每位受试者剩余任务块中编号最高的对应记录即可。
场景1:保留最高符合要求block下的所有明细作答记录
library(dplyr) # 你的原始数据构造 df <- tibble(id = c(1, 1, 1, 1, 1, 2, 2, 2 ), block = c(2, 2, 2, 3, 3, 2, 2, 3), answer = "TRUE") result <- df %>% # 统计每个id下每个block的正确作答数量 group_by(id, block) %>% mutate(correct_cnt = n()) %>% ungroup() %>% # 过滤掉正确数不足2的block filter(correct_cnt >= 2) %>% # 每个id取最高的block对应的所有记录 group_by(id) %>% filter(block == max(block)) %>% # 删除辅助统计列,恢复原始表结构 select(-correct_cnt) %>% ungroup()
运行后输出结果将包含:受试者1的block3共2条记录、受试者2的block2共2条记录,完全匹配你的需求。
场景2:仅输出每个受试者1行的汇总结果
如果你不需要保留明细作答,只需要每位受试者对应最高符合要求的block信息,可以使用以下代码:
summary_result <- df %>% group_by(id, block) %>% summarise(correct_cnt = n(), .groups = "drop") %>% filter(correct_cnt >= 2) %>% group_by(id) %>% slice_max(block, n = 1) %>% ungroup()
内容的提问来源于stack exchange,提问作者MeiLing
相关产品推荐
相关产品推荐

