R语言9波宽格式纵向数据如何排除仅0/1个时间点有数据的参与者
实现方法
你需要的筛选逻辑本质是:逐行统计w1到w9共9个波次列中的缺失值(NA)数量,剔除缺失值数量为8或9的行——这类行对应的参与者仅在0或1个时间点存在有效数据。
基础R版本(无需安装额外依赖,处理大型数据集速度快)
# 定位所有波次列,避免把ID、其他协变量纳入统计 wave_columns <- paste0("w", 1:9) # 逐行计算波次列的NA总数 row_na_num <- rowSums(is.na(Merged[, wave_columns])) # 保留NA数小于8的行(即有效数据点≥2的参与者) Result <- Merged[row_na_num < 8, ]
代码逻辑说明:is.na()会逐单元格判断值是否为NA,返回TRUE/FALSE的逻辑矩阵;rowSums()按行求和时,TRUE会被记为1、FALSE记为0,求和结果就是对应行的NA总个数,全程向量化运算,百万行级数据集也能快速出结果。
dplyr版本(代码可读性更高,适合习惯tidyverse语法的用户)
如果平时用dplyr做数据处理,可以用下面的写法:
library(dplyr) Result <- Merged %>% rowwise() %>% # 统计w1到w9列的NA数量 mutate(temp_na_count = sum(is.na(c_across(w1:w9)))) %>% ungroup() %>% # 筛选符合条件的行 filter(temp_na_count < 8) %>% # 移除临时生成的计数列 select(-temp_na_count)
注意:统计NA时不要把ID列或其他非波次测量的变量纳入计算,否则会导致缺失值计数错误,筛选结果偏差。你之前用的单列条件筛选也是行索引筛选逻辑,和上述写法的核心框架一致,只是把单列判断替换成了多列缺失值的聚合判断。
内容的提问来源于stack exchange,提问作者Jonas L
相关产品推荐
相关产品推荐

