在R中按地理区域分组后统计数据框变量的不同值计数
解决R语言中按分组统计变量各值(含NA)出现次数的问题
你想要按地理区域分组,统计某个变量不同取值(包括NA)的出现次数,用tidyverse工具完全可以实现,之前的代码问题在于没有指定要统计的目标变量,也没设置正确的计数逻辑。下面给你几种实用的方法:
方法1:用count()快速统计单个变量的分组分布
count()是group_by()+summarize(n())的语法糖,用起来非常简洁,还能保留NA的分组:
# 按WHOregion分组,统计UrbanSanPol各值的数量(包含NA) df %>% count(WHOregion, UrbanSanPol, .drop = FALSE)
.drop = FALSE参数会保留所有可能的分组组合,哪怕某个区域没有某个取值(比如某区域没有0,也会显示该行,计数为0),如果不需要可以去掉这个参数。- 运行后会得到三列:区域、变量值、对应计数,完全符合你的需求。
方法2:用group_by()+summarize()手动实现
如果你更习惯用summarize(),可以这样写,效果和上面一致:
df %>% group_by(WHOregion, UrbanSanPol, .drop = FALSE) %>% summarize(count = n(), .groups = "drop")
.groups = "drop"是让结果回到普通dataframe,避免后续操作受分组状态影响。
方法3:统计多个变量的分组分布
如果需要同时统计多个变量(比如UrbanSanPol、UrbanSanWom),可以先把数据转成长格式再统计:
df %>% # 保留分组列和需要统计的变量列 select(WHOregion, UrbanSanPol, UrbanSanWom) %>% # 把多个变量转成"变量名-变量值"的长格式 pivot_longer(cols = -WHOregion, names_to = "variable", values_to = "value") %>% # 按区域、变量、值分组计数 group_by(WHOregion, variable, value, .drop = FALSE) %>% summarize(count = n(), .groups = "drop")
这样一次性就能得到所有目标变量在各区域的取值分布。
方法4:单独统计各值(含NA)为列
如果你希望把每个取值的计数作为单独的列展示(比如count_0、count_1、count_NA),可以用sum()结合条件判断:
df %>% group_by(WHOregion) %>% summarize( count_0 = sum(UrbanSanPol == "0", na.rm = TRUE), count_1 = sum(UrbanSanPol == "1", na.rm = TRUE), count_NA = sum(is.na(UrbanSanPol)) )
na.rm = TRUE确保计算时忽略NA值对求和的影响,准确统计对应取值的数量。
为什么你的原代码没生效?
你之前写的df %>% group_by(region) %>% summarize(count)没有指定计数的逻辑,也没有按要统计的变量分组,所以最终只会得到每个区域的总行数,而不是各取值的分布。
内容的提问来源于stack exchange,提问作者user1778351
相关产品推荐
相关产品推荐

