R语言按各测量组最低应答数筛选数据框子集的方法咨询
R数据筛选实现方案
核心判断逻辑
筛选以单个受试者+单个测试阶段为独立判断单元,仅保留同时满足以下两个条件的单元对应数据行:
- 单元内Measure 1模块的3道题目中,至少1道为非NA的有效作答
- 单元内Measure 2模块的3道题目中,至少1道为非NA的有效作答
不符合条件的行直接剔除,对应给出的示例,剔除后共保留12行有效数据。
方法1:dplyr实现(推荐,适配大型数据集)
library(dplyr) df_clean <- df %>% group_by(tester_ID, Phase) %>% filter( # 统计当前分组下Measure1的有效作答总数 sum(!is.na(c_across(contains("Measure1")))) >= 1, # 统计当前分组下Measure2的有效作答总数 sum(!is.na(c_across(contains("Measure2")))) >= 1 ) %>% ungroup()
运行后会自动剔除两类无效行:Phase1阶段的A2(Measure2题目全为NA)、Phase2阶段的A6(Measure1题目全为NA),最终得到12行有效数据。
方法2:Base R实现(无需加载第三方包)
# 识别Measure1、Measure2对应的列位置 m1_cols <- grep("Measure1", colnames(df)) m2_cols <- grep("Measure2", colnames(df)) # 按受试者+阶段分组标记保留行 keep <- ave( rowSums(!is.na(df[, m1_cols])) >= 1 & rowSums(!is.na(df[, m2_cols])) >= 1, list(df$tester_ID, df$Phase), FUN = all ) df_clean_base <- df[as.logical(keep), ]
结果校验
执行代码后可通过以下命令核对输出行数,确认筛选逻辑正确:
nrow(df_clean) # 返回结果:[1] 12
内容的提问来源于stack exchange,提问作者Stats Iliterate
相关产品推荐
相关产品推荐

