如何使用dplyr在R中生成含频数与占比的DataFrame统计表格?
在R中生成目标统计表格的解决方案
先构造你的示例数据:
# 创建示例数据框 df <- data.frame( Country = c("Country 1", "Country 1", "Country 2", "Country 1", "Country 2", "Country 3", "Country 3"), Gender = c("F", "F", "F", "M", "M", "F", "M"), Income = c("Inc1", "Inc2", "Inc2", "Inc1", "Inc3", "Inc3", "Inc2") )
方法1:生成「国家-性别」交叉,单元格展示收入及计数
适合需要在每个国家×性别单元格内汇总各收入类别的场景:
library(dplyr) library(tidyr) result <- df %>% # 统计每个国家-性别-收入的出现次数 count(Country, Gender, Income, name = "Count") %>% # 合并收入和计数为字符串 mutate(Income_Stats = paste(Income, Count, sep = ": ")) %>% # 按国家和性别分组,汇总所有收入统计 group_by(Country, Gender) %>% summarise(Income_Summary = paste(Income_Stats, collapse = ", "), .groups = "drop") %>% # 转成宽表,性别作为列 pivot_wider(names_from = Gender, values_from = Income_Summary, values_fill = "无数据") print(result)
输出结果:
# A tibble: 3 × 3 Country F M <chr> <chr> <chr> 1 Country 1 Inc1: 1, Inc2: 1 Inc1: 1 2 Country 2 Inc2: 1 Inc3: 1 3 Country 3 Inc3: 1 Inc2: 1
方法2:生成三维列联表(国家×性别×收入)
适合需要清晰展示每个组合下各收入频数的场景:
# 用基础R的xtabs生成列联表,再转成数据框 xtabs_result <- as.data.frame(xtabs(~ Country + Gender + Income, data = df)) # 转成宽表,收入作为列 wide_result <- pivot_wider(xtabs_result, names_from = Income, values_from = Freq, values_fill = 0) print(wide_result)
输出结果:
# A tibble: 6 × 4 Country Gender Inc1 Inc2 Inc3 <chr> <fct> <dbl> <dbl> <dbl> 1 Country 1 F 1 1 0 2 Country 1 M 1 0 0 3 Country 2 F 0 1 0 4 Country 2 M 0 0 1 5 Country 3 F 0 0 1 6 Country 3 M 0 1 0
方法3:用janitor包生成结构化交叉表
janitor的tabyl函数可以直接生成带分层表头的统计表格,更接近专业统计报表样式:
library(janitor) # 生成国家×性别×收入的分层交叉表 tabyl_result <- df %>% tabyl(Country, Gender, Income) print(tabyl_result)
输出的表格会自动按性别分组展示各收入的频数,结构更清晰。
内容的提问来源于stack exchange,提问作者anso_s
相关产品推荐
相关产品推荐

