在R语言中计算种族年龄表各群体中位年龄的方法求助
解决种族年龄中位数计算问题
你的核心问题是数据格式不匹配:当前数据是宽格式的汇总表(每行对应一个年龄,列是各种族的对应人数),但tapply需要的是长格式的个体级数据(每一行代表一个人的年龄和所属种族),所以直接使用tapply会因多数种族无有效展开的年龄记录返回NA。
步骤1:转换数据格式
先把宽格式数据转成长格式,并按人数展开为个体记录(假设你的数据框名为df,第一列是年龄列age):
# 先安装并加载tidyverse包(如果未安装) # install.packages("tidyverse") library(tidyverse) # 宽转长并展开个体记录 long_df <- df %>% pivot_longer(cols = -age, names_to = "RACE", values_to = "count") %>% uncount(count) # 按count值重复行,生成每个个体的年龄数据
步骤2:计算各种族中位年龄
可以用两种方式实现:
方式1:使用tapply
RaceAge <- tapply(long_df$age, long_df$RACE, median)
输出结果会是类似这样的向量:
Asian Black Hispanic White 20.85833 21.00 21.48889 20.00
方式2:使用dplyr分组计算(更直观)
RaceAge <- long_df %>% group_by(RACE) %>% summarise(median_age = median(age))
输出结果是数据框格式,便于后续处理:
# A tibble: 4 × 2 RACE median_age <chr> <dbl> 1 Asian 20.9 2 Black 21 3 Hispanic 21.5 4 White 20
验证示例数据
用你提供的示例数据测试,构造数据框代码:
df <- data.frame( age = c(15,17,19,20,20.8388888888889,20.8583333333333,21,21.4888888888889,21.5277777777778), Asian = c(0,0,0,0,2,2,1,0,0), Black = c(0,0,0,0,0,0,7,0,0), Hispanic = c(0,0,0,0,0,0,1,2,2), White = c(6,9,8,12,0,0,31,0,0) )
运行上述转换和计算代码,即可得到正确的中位年龄结果。
内容的提问来源于stack exchange,提问作者CodeRCodeP
相关产品推荐
相关产品推荐

