You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:25:24