如何在DataFrame中按十年人均收入中位数对符合条件的国家排名
按人均收入十年中位数对各国排名的实现方案
核心需求
- 基于PWT10数据集,为每个十年(如1950年代、1960年代)计算各国人均收入的十年中位数
- 仅纳入对应十年起始年份(如1950、1960)已有收入数据的国家,避免样本波动影响结果
- 按中位数降序排名,最富裕国家排第1位,最贫困国家排末位
实现代码
# 安装并加载依赖包 install.packages(c("pwt10", "dplyr")) library(pwt10) library(dplyr) # 加载PWT10.01数据 data(pwt10.01) # 数据预处理+十年中位数排名计算 PWT_decade_ranks <- pwt10.01 |> # 筛选指定的i_cig类型(与原代码一致) filter(i_cig %in% c("ICPPPP-benchmark+interpolated", "ICPPPP-extrapolated", "benchmark", "extrapolated", "interpolated")) |> # 计算以美国为基准的PL_CON mutate(PL_CON = pl_con / pl_con[isocode == "USA"], .by = year) |> # 计算人均收入Income mutate(Income = ccon * PL_CON / pop, .by = year) |> # 生成十年分组标记(如1950-1959统一标记为1950) mutate(decade = floor(year / 10) * 10) |> # 判断每个国家在对应十年的起始年是否有有效收入数据 mutate(has_start_data = !is.na(Income[year == decade]), .by = c(isocode, decade)) |> # 仅保留起始年有数据的国家记录 filter(has_start_data) |> # 计算每个国家在对应十年的收入中位数 mutate(decade_income_median = median(Income, na.rm = TRUE), .by = c(isocode, decade)) |> # 按十年分组,对中位数降序排名(ties.method处理并列情况) mutate(decade_rank = rank(-decade_income_median, ties.method = "min"), .by = decade) |> # 去重,保留每个国家-十年的唯一核心结果 distinct(isocode, decade, country, decade_income_median, decade_rank) # 查看最终结果 View(PWT_decade_ranks)
关键步骤说明
- 十年分组:通过
floor(year/10)*10将所有年份映射到对应十年的起始年,方便后续分组计算 - 样本筛选:利用
.by = c(isocode, decade)分组判断,确保只有在十年起始年有数据的国家才会被纳入该十年的排名计算 - 中位数计算:按国家和十年分组,计算该时间段内人均收入的中位数,有效降低汇率波动带来的短期数据波动
- 排名生成:对中位数取负值后使用
rank()函数,实现降序排名;ties.method = "min"保证并列国家获得相同的最高排名
内容的提问来源于stack exchange,提问作者Anon9001
相关产品推荐
相关产品推荐

