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
相关产品推荐
相关产品推荐

