如何在DataFrame中按国家分组计算人均GDP年度百分比变化
问题
已编写代码计算变量的年度百分比变化,现需扩展功能:针对包含多国历年人均GDP的DataFrame,按国家分组计算各国历年人均GDP的百分比变化。现有代码未加入分组逻辑,需结合group_by()实现该需求。
现有代码:
df |> mutate(pdiff = 100*(gdp_per_capita - lag(gdp_per_capita))/gdp_per_capita)
示例数据:
df <- data.frame( Country_Name = rep(c("Albania", "Algeria", "Bosnia", "Croatia"), each = 4), year = rep(2018:2021, 4), gdp_per_capita = c(5287.664, 5396.216, 5332.160, 6494.386, 4142.019, 3989.668, 3306.858, 3765.035, 6070.353, 6119.762, 6082.367, 6916.438, 15227.560, 15311.767, 14132.487, 17398.766) )
解决方案
只需在mutate()之前添加group_by(Country_Name),让lag()函数在每个国家的分组内计算前一年的人均GDP值,即可实现按国家分组的年度百分比变化计算:
library(dplyr) df |> group_by(Country_Name) |> mutate(pdiff = 100*(gdp_per_capita - lag(gdp_per_capita))/gdp_per_capita) |> ungroup() # 可选:取消分组,恢复普通DataFrame结构
说明
group_by(Country_Name):将数据按国家分组,后续的mutate操作会在每个组内独立执行lag(gdp_per_capita):在每个国家组内,获取上一年的人均GDP值,因此每个国家的第一年(如2018年)会返回NA(无前置数据)ungroup():可选操作,若后续不需要保留分组结构,可取消分组,避免后续操作受分组影响
运行结果示例
执行代码后,数据会新增pdiff列,部分结果如下:
# A tibble: 16 × 4 Country_Name year gdp_per_capita pdiff <chr> <int> <dbl> <dbl> 1 Albania 2018 5288. NA 2 Albania 2019 5396. 2.01 3 Albania 2020 5332. -1.20 4 Albania 2021 6494. 17.9 5 Algeria 2018 4142. NA 6 Algeria 2019 3990. -3.82 7 Algeria 2020 3307. -20.6 8 Algeria 2021 3765. 12.2 # … with 8 more rows
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

