Group_by失效,summarize()计算结果完全相同?技术求助
问题原因分析
1. 分组变量与原数据行完全错位
你创建arth和no_arth列的逻辑完全错误:
- 你先筛选出
HAVARTH3=="1"的行存为a,HAVARTH3=="2"的行存为b,随后将a转成向量后拼接NA赋值给原数据的arth列,b转成向量拼接NA赋值给no_arth列。 - 这种操作会导致:
arth列的前nrow(a)行被强制赋值为1(不管原数据该行的HAVARTH3实际值是什么),其余行是NA;no_arth列的前nrow(b)行被强制赋值为2,其余行是NA。 - 最终
arth/no_arth列的取值和原数据对应行的关节炎状态完全不匹配,分组统计时自然无法得到正确的分组结果。
2. 分组逻辑冗余且错误
你用group_by(arth,no_arth)分组,而数据中没有任何一行同时拥有arth和no_arth的非NA值,分组后实际是把arth非NA的所有行、no_arth非NA的所有行分别统计,但由于变量错位,这两组的体重数据实际是原数据的随机切片,而非对应关节炎状态的样本,最终导致均值和标准差完全一致。
3. 体重NA值未过滤
你提到要去除weight的NA值,但现有代码未对weight的NA行进行过滤,进一步干扰了统计结果。
修正方案
直接基于原数据的HAVARTH3字段生成对应分类变量,保证每行的关节炎状态与体重一一对应:
library(dplyr) # 数据清洗:过滤无效值,生成分类变量 BRFSS2015_clean <- BRFSS2015 %>% mutate(weight = WEIGHT2) %>% # 过滤体重NA值,仅保留HAVARTH3为1/2的有效样本 filter(!is.na(weight), HAVARTH3 %in% c("1", "2")) %>% # 生成单一分类变量标记关节炎状态 mutate(arthritis_status = case_when( HAVARTH3 == "1" ~ "arth", HAVARTH3 == "2" ~ "no_arth" )) # 分组统计均值和标准差 BRFSS2015_clean %>% group_by(arthritis_status) %>% summarize( mean_weight = mean(weight), sd_weight = sd(weight) )
修正点说明
- 直接在原数据行上生成分类变量,彻底避免数据错位问题;
- 提前过滤无效样本,确保统计仅针对有效数据;
- 用单一分类变量分组,逻辑清晰,符合分组统计的常规用法。
内容的提问来源于stack exchange,提问作者jakdar
相关产品推荐
相关产品推荐

