按ID组合为tibble/dataframe新增行:tidy tibble类时间序列操作实现
实现方法
你不需要使用专门的时间序列对象,基于tidyverse的原生功能就可以满足需求,有两种常用的实现思路,适配不同使用场景:
首先第一步先做数据预处理,你提供的示例数据中Year和Emissions均为字符格式,需要先转为数值类型才能参与计算:
library(tidyverse) # 转换数据类型 Emissions <- Emissions %>% mutate( Year = as.integer(Year), Emissions = as.numeric(Emissions) )
方法1:宽表转换法(和Excel操作逻辑一致,最直观)
如果你只需要固定计算2035年的排放值,直接转宽表取数计算的逻辑最不容易出错,和你在Excel里按年份列计算的逻辑完全一致:
Emissions_updated <- Emissions %>% # 按部门+区域分组,每个组独立计算 group_by(Sector, CountryOrRegion) %>% # 转宽表,每列对应一个年份的排放值 pivot_wider(names_from = Year, values_from = Emissions) %>% # 按你给出的公式计算2035年排放 mutate(`2035` = `2030` + (`2030` - `2025`)) %>% # 转回tidy长表格式 pivot_longer(cols = `2025`:`2035`, names_to = "Year", values_to = "Emissions") %>% ungroup()
方法2:通用滞后算子法(适合多时间点、批量计算场景)
如果需要实现通用的“滞后算子”功能,不用转宽表,直接用dplyr原生的lag()函数即可,只要分组后按年份排序,就能实现按组取滞后N期的值:
# 通用滞后计算示例:取每个分组5年前的排放值、计算5年增量 Emissions %>% group_by(Sector, CountryOrRegion) %>% arrange(Year) %>% mutate( # n=1代表取当前行的上一行(即5年前)的排放值 lag_5y_Emissions = lag(Emissions, n = 1), delta_5y = Emissions - lag_5y_Emissions ) # 基于通用滞后逻辑生成2035年的新行 Emissions_updated <- Emissions %>% group_by(Sector, CountryOrRegion) %>% arrange(Year) %>% # 计算最新的5年增量 mutate(delta = last(Emissions) - lag(last(Emissions))) %>% # 给每个分组新增2035年的行 group_modify(~ add_row(.x, Year = 2035, Emissions = last(.x$Emissions) + first(.x$delta))) %>% select(-delta) %>% ungroup()
补充说明
- 以上两种方法输出的结果都和你给出的期望格式一致,不需要额外转换为xts、ts等专门的时间序列对象
- 如果你后续需要做更复杂的时间序列建模(如时序预测、季节性检验等),可以使用
tsibble这类tidy时序对象,完全兼容dplyr的操作语法,学习成本很低 - 如果需要扩展到计算2040、2045等更多年份的数据,只需要在方法2的逻辑基础上循环迭代即可,不需要修改核心计算规则
内容的提问来源于stack exchange,提问作者Stephen Stretton
相关产品推荐
相关产品推荐

