R语言分组计算乘积和两种方法结果不一致问题排查
问题原因分析
1. C4_0ps1与C4_0ps2结果差异的原因
你方法二中的sum(C4_0p,n.rm=T)存在参数拼写错误:正确参数名是na.rm而非n.rm。虽然当前样本数据无NA,这个错误不会直接导致结果偏差,但如果后续数据出现NA,会引发计算错误。你提到的“结果大1个单位”更可能是测试时的计算失误或代码重复执行误操作导致的(比如误将mutate(C4_0p=C4_0*tg)写成mutate(C4_0p=C4_0p*tg),会导致乘积被重复相乘)。
另外,检查方法一的pivot_wider:如果数据中存在同一(Matricola, datc, Mung)组合的多行数据,pivot_wider默认会将值存入列表列,此时tg_M*C4_0_M会生成列表而非单个数值,导致case_when计算错误。但从你提供的样本数据看,不存在这种重复组合,方法一的计算逻辑是正确的。
2. my_prd2仍按Matricola分组的原因
在dplyr新版本中,summarise默认使用.groups = "drop_last"参数,这会在分组汇总时仅取消最后一个分组变量(即datc),保留前面的Matricola分组。如果需要完全取消分组,有两种解决方式:
- 在
summarise中添加.groups = "drop":
my_prd2<-my_tbl%>%group_by(Matricola,datc)%>% summarise(n=n(),C4_0ps2=sum(C4_0p,na.rm=T),.groups = "drop")
- 后续调用
ungroup():
my_prd2<-my_tbl%>%group_by(Matricola,datc)%>% summarise(n=n(),C4_0ps2=sum(C4_0p,na.rm=T))%>% ungroup()
验证结果一致性的方法
可以合并两个结果表,对比数值差异:
comparison <- inner_join(my_prd1, my_prd2, by = c("Matricola", "datc")) comparison %>% mutate(diff = C4_0ps1 - C4_0ps2) %>% filter(diff != 0)
如果返回空表,说明两种方法的计算完全一致。
内容的提问来源于stack exchange,提问作者racheese72
相关产品推荐
相关产品推荐

