如何高效统计年份、种族、族裔多维度数据的频数?
高效统计年份-种族-族裔组合频数的方法
问题背景
我有一个敏感数据集,因此制作了以下模拟数据集用于展示:
df <- data.frame( Year = c("2010", "2010", "2010", "2011", "2011", "2012", "2013", "2013", "2013"), Race = c("White", "White", "Asian", "White", "Black", "Black", "Unknown", "Unknown", "White"), Ethnicity = c("Hispanic", "Hispanic", "Not Hispanic", "Hispanic", "Not Hispanic", "Not Hispanic", "Unknown", "Hispanic", "Not Hispanic") )
实际数据集覆盖2010-2021年共12个年份,包含约6-7个种族类别,以及3种族裔选项(Hispanic/Latino、Not Hispanic/Latino、Unknown)。
我需要统计每一组年份、种族、族裔组合的频数,但目前用自定义函数逐个调用的方式需要写200+行代码,效率极低,尝试for循环也没成功,希望得到高效实现方法。
原自定义函数(存在语法错误):
raceethfunc <- function(x,y,z){ df %>% filter(Race == x & Ethnicity == y and Year = z) %>% nrow() } H_white2010 <- raceethfunc(x = "White", y = "Hispanic or Latino", z = "2010") H_white2011 <- raceethfunc(x = "White", y = "Hispanic or Latino", z = "2011") H_white2012 <- raceethfunc(x = "White", y = "Hispanic or Latino", z = "2012")
高效解决方案
不需要手动编写每一组的统计代码,以下两种方法可以一次性生成所有组合的频数:
方法1:使用dplyr的count()函数(推荐,代码简洁)
dplyr包的count()函数可以直接按指定列分组并统计频数,自动包含所有非零频数的组合;如果需要补全所有可能的组合(包括频数为0的),可以搭配tidyr::complete():
library(dplyr) library(tidyr) # 统计所有非零频数的组合 freq_table <- df %>% count(Year, Race, Ethnicity, name = "Frequency") # 补全所有可能的组合(频数为0的也显示) freq_table_full <- df %>% count(Year, Race, Ethnicity, name = "Frequency") %>% complete(Year, Race, Ethnicity, fill = list(Frequency = 0))
方法2:使用基础R的table()函数
基础R的table()函数可以快速生成多维交叉频数表,结果可转为数据框格式方便阅读:
# 生成频数表(多维数组格式) freq_table <- table(df$Year, df$Race, df$Ethnicity) # 转为数据框格式 freq_df <- as.data.frame(freq_table, responseName = "Frequency")
原函数的语法错误修正(供参考)
如果一定要保留自定义函数,需修正两处基础语法错误:
- R中逻辑与运算符是
&,不是and - 相等判断用
==,赋值才用=
修正后的函数:
raceethfunc <- function(x,y,z){ df %>% filter(Race == x & Ethnicity == y & Year == z) %>% nrow() }
但依然不推荐这种手动调用的方式,效率过低。
新手提示
- 优先使用
dplyr的分组统计方法,代码直观,后续排序、筛选等二次处理更便捷 - 若需要处理缺失类别或补全所有组合,
tidyr::complete()是实用工具
内容的提问来源于stack exchange,提问作者shollaback
相关产品推荐
相关产品推荐

