R语言:如何用紧凑写法自动计算分组下各ethnicity的占比
自动计算分组内各ethnicity占比的紧凑实现方式
可以结合dplyr和tidyr的函数实现自动适配所有ethnicity取值的占比计算,无需手动定义每个占比字段,步骤如下:
1. 准备示例数据
假设你的数据集是原始观测数据(每行代表一个个体),或者已包含计数列:
library(dplyr) library(tidyr) # 原始观测数据示例 raw_df <- tibble( number_of_degrees = sample(1:3, 100, replace = TRUE), ethnicity = sample(c("A", "B", "C"), 100, replace = TRUE) ) # 带计数列的数据集示例 count_df <- tibble( number_of_degrees = rep(c(1, 2, 3), each = 3), ethnicity = rep(c("A", "B", "C"), 3), count = sample(10:50, 9) )
2. 针对原始观测数据的实现
先按number_of_degrees和ethnicity分组统计数量,再计算分组内占比,最后转宽生成对应占比字段:
raw_df_percent <- raw_df %>% # 分组统计每个ethnicity的数量 group_by(number_of_degrees, ethnicity) %>% summarise(n = n(), .groups = "drop_last") %>% # 计算分组内占比(转为百分比) mutate(percent = n / sum(n) * 100) %>% # 移除计数列,转宽生成percent_前缀的占比字段 select(-n) %>% pivot_wider( names_from = ethnicity, values_from = percent, names_prefix = "percent_" )
3. 针对带计数列的数据集的实现
直接基于已有计数列计算占比并转宽:
count_df_percent <- count_df %>% group_by(number_of_degrees) %>% # 计算每个ethnicity在分组内的占比 mutate(percent = count / sum(count) * 100) %>% select(-count) %>% pivot_wider( names_from = ethnicity, values_from = percent, names_prefix = "percent_" )
核心逻辑说明
group_by(number_of_degrees)确保在每个学位数量组内计算占比pivot_wider自动将ethnicity的所有取值转为列名,配合names_prefix统一添加percent_前缀,无需手动逐个定义percent_a、percent_b等字段- 无论
ethnicity有多少种取值,代码都能自动适配生成对应的占比列
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

