使用group_by和mutate按年份计算相关系数结果异常的问题排查
按年份分组计算相关系数的错误排查与修正
问题描述
单独按年份过滤计算lifeExp和gdpPercap的相关系数时,不同年份结果有差异;但用group_by+mutate批量计算时,新数据框里所有年份的相关系数都完全相同。
问题复现代码
单独计算(结果正确)
gm52 <- gapminder %>% filter(year == 1952) cor(gm52$lifeExp, gm52$gdpPercap, use = "complete.obs") gm57 <- gapminder %>% filter(year == 1957) cor(gm57$lifeExp, gm57$gdpPercap, use = "complete.obs")
批量计算(结果异常)
gmtest <- gapminder %>% group_by(year) %>% mutate(crltn = cor(gmtest$lifeExp, gmtest$gdpPercap, use = "complete.obs"))
错误原因
这段批量代码的核心问题:
- 在
mutate里引用了还未创建的gmtest对象,此时gmtest未完成赋值,实际调用的是全局环境中旧数据(或直接报错); - 即便
gmtest存在,gmtest$lifeExp也会调用整个数据框的完整列,而非group_by(year)后的分组子集,最终计算出的是全局相关系数,重复填充到所有分组行中。
正确解决方案
方案1:保留原数据行,添加分组系数
直接引用列名即可,dplyr会自动识别分组,对每个年份的子集单独计算相关系数:
gmtest <- gapminder %>% group_by(year) %>% mutate(crltn = cor(lifeExp, gdpPercap, use = "complete.obs"))
方案2:生成年份-系数的汇总表
如果不需要把系数重复到每一行,只需要每个年份对应一个系数的精简结果,用reframe更高效:
gm_cor <- gapminder %>% group_by(year) %>% reframe(crltn = cor(lifeExp, gdpPercap, use = "complete.obs"))
内容的提问来源于stack exchange,提问作者Warsame
相关产品推荐
相关产品推荐

