如何在R中使用行均值替换问卷各量表题项的缺失值
R语言按量表分组行均值插补缺失值实现方案
示例数据集
df <- data.frame(A1 = c(6, 8, NA, 1, 5), A2 = c(NA, NA, 9, 3, 6), A3 = c(9, NA, 1, NA, 4), B1 = c(NA, NA, 9, 3, 6), B2 = c(9, NA, 1, NA, 4), B3 = c(NA, NA, 9, 3, 6) )
实现方案
以下两种是最常用的实现方式,可根据你的使用场景选择:
方案1:基础R实现(无额外依赖)
适合不需要引入额外包的轻量场景,代码逻辑直白易修改:
# 匹配对应量表的列 A_cols <- grep("^A", names(df)) B_cols <- grep("^B", names(df)) # 处理A类题项缺失值 A_row_mean <- rowMeans(df[, A_cols], na.rm = TRUE) df[, A_cols][is.na(df[, A_cols])] <- A_row_mean[which(is.na(df[, A_cols]), arr.ind = TRUE)[, "row"]] # 处理B类题项缺失值 B_row_mean <- rowMeans(df[, B_cols], na.rm = TRUE) df[, B_cols][is.na(df[, B_cols])] <- B_row_mean[which(is.na(df[, B_cols]), arr.ind = TRUE)[, "row"]]
方案2:tidyverse实现(适合多量表扩展场景)
适合量表数量多、后续需要频繁调整规则的场景,代码可读性和可扩展性更强:
library(dplyr) df_imputed <- df %>% # 按行计算 rowwise() %>% mutate( # 批量处理A类所有题项 across(starts_with("A"), ~ifelse(is.na(.x), mean(c_across(starts_with("A")), na.rm = TRUE), .x)), # 批量处理B类所有题项 across(starts_with("B"), ~ifelse(is.na(.x), mean(c_across(starts_with("B")), na.rm = TRUE), .x)) ) %>% # 取消行分组,恢复常规数据框结构 ungroup()
注意事项
- 如果某一行对应量表的所有值都为缺失值,插补结果会返回
NaN,可额外添加判断逻辑将这类值替换为量表总均值或其他自定义填充值。 - 题项匹配规则可按需调整,如果题项命名不是以前缀区分,可手动定义列名向量传入匹配逻辑即可。
内容的提问来源于stack exchange,提问作者Marie
相关产品推荐
相关产品推荐

