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

R中如何按年份对多年份数据框内的国家平均消费收入相对排名?

问题分析与解决方法

原代码错误原因

你的代码问题出在:每个ifelse分支里的percent_rank(PWT1950$ccon/PWT1950$pop)都是基于整个PWT1950数据集计算的百分比排名,并没有筛选对应年份的子集。所以最终得到的IncomeRank是所有年份合并后的全局排名,而非你需要的「每年内部各国相对排名」。

正确实现方式

用dplyr的分组操作(group_by())可以轻松实现分年计算,代码更简洁且不易出错:

# 安装并加载所需包
install.packages(c("pwt10", "dplyr"))
library(pwt10)
library(dplyr)

# 加载Penn World Table数据
data(pwt10.01)

# 筛选1950-1959年符合条件的数据,并按年份计算人均消费的百分比排名
PWT1950 <- pwt10.01 %>%
  # 筛选条件和你原代码一致
  filter(year %in% 1950:1959,
         i_cig %in% c("benchmark", "extrapolated", "interpolated"),
         i_xr == "market") %>%
  # 按年份分组,确保排名仅在当年内计算
  group_by(year) %>%
  # 计算每年内的人均消费百分比排名
  mutate(IncomeRank = percent_rank(ccon / pop)) %>%
  # 取消分组,恢复普通数据框格式
  ungroup()

验证结果

执行以下代码验证1959年的排名是否和你单独计算的一致:

# 从分组计算的结果中提取1959年数据
rank_grouped <- PWT1950 %>%
  filter(year == 1959) %>%
  select(IncomeRank, country)

# 单独计算1959年的排名(和你原代码一致)
PWT1959 <- subset(pwt10.01, year == "1959" & 
                    i_cig %in% c("benchmark", "extrapolated", "interpolated") & 
                    i_xr == "market")
PWT1959$IncomeRank <- percent_rank(PWT1959$ccon/PWT1959$pop)
rank_separate <- subset(PWT1959, select = c(IncomeRank, country))

# 对比两者结果(排序后对比)
all.equal(
  rank_grouped %>% arrange(country),
  rank_separate %>% arrange(country)
)

运行后会返回TRUE,说明两种方式的结果完全一致。

内容的提问来源于stack exchange,提问作者Anon9001

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:01:16