如何用一行代码替代group_by后逐个变量求均值?及NA问题排查
问题解决:简化分组求均值代码 + NA值排查
一、简化分组求均值的代码
你原来逐个变量写mean的重复操作,用dplyr的across()函数就能一次性搞定,一行代码完成:
mtmm_data4 <- mtmm_data %>% group_by(cntry_lan, admdw) %>% summarise(across(matches("^M\\dT\\d"), ~mean(.x, na.rm = TRUE)), .groups = "drop")
说明:
matches("^M\\dT\\d")专门匹配你所有M1T1、M2T1这类格式的变量;如果要对所有非分组变量求均值,也可以换成everything().groups = "drop"用来取消分组结构(可选,根据你后续需求决定是否保留)
二、M2T1、M3T1、M3T2全为NA的可能原因及排查方法
1. 分组内对应变量无有效数据
如果某个cntry_lan + admdw的分组下,目标变量的所有值都是NA,那mean(..., na.rm=TRUE)自然会返回NA。用下面的代码检查每组中这些变量的非NA值数量:
mtmm_data %>% group_by(cntry_lan, admdw) %>% summarise(across(c(M2T1, M3T1, M3T2), ~sum(!is.na(.x))))
如果结果里某行的数值为0,就说明该分组下对应变量全是NA。
2. 变量名拼写不匹配
R是区分大小写的,要是原数据集里的变量名是M2t1(小写t),而你写的是M2T1,就会因为找不到变量返回NA。直接运行colnames(mtmm_data)就能查看所有变量名,核对是否一致。
3. 全数据集内变量无有效数据
如果整个数据集里这些变量本身就没有非NA值,那分组求均值后自然全是NA。用下面的代码检查全数据集的非NA值数量:
sapply(mtmm_data[c("M2T1", "M3T1", "M3T2")], function(x) sum(!is.na(x)))
如果结果都是0,说明这些变量从一开始就没有有效数据。
内容的提问来源于stack exchange,提问作者Korkut
相关产品推荐
相关产品推荐

