如何在tidyverse中对面板数据按组计算时间累积求和
面板数据的时间维度累积求和(保留原行数)
问题描述
我有一份面板数据,每个家庭对应多条重复观测记录,每个家庭随时间被观测,包含某项特征(示例中为variable)。已通过group_by(id, year)计算出每年的组内求和,但需要实现如示例goal列所示的时间维度累积求和,且必须保留原数据的10行记录,不能按年份聚合。需要实现:选取每个家庭每年仅一个组内求和值来进行累积计算,并将结果映射到原数据的每一行。
示例数据
set.seed(1234) data <- data.frame(id = rep(100, 10), year = c(rep(2022, 5), rep(2023, 5)), variable = rbinom(10, 1, 0.5)) library(tidyverse) # 先计算年度组内求和 data <- data %>% group_by(id, year) %>% mutate(group_sum_per_year = sum(variable)) # 目标结果列 data$goal <- c(4,4,4,4,4,7,7,7,7,7) data
输出结果:
# A tibble: 10 × 5 # Groups: id, year [2] id year variable group_sum_per_year goal <dbl> <dbl> <int> <int> <dbl> 1 100 2022 0 4 4 2 100 2022 1 4 4 3 100 2022 1 4 4 4 100 2022 1 4 4 5 100 2022 1 4 4 6 100 2023 1 3 7 7 100 2023 0 3 7 8 100 2023 0 3 7 9 100 2023 1 3 7 10 100 2023 1 3 7
解决方案
核心逻辑:先计算每个家庭-年份的组内求和,再按家庭对年度求和值做累积求和,最后将累积结果映射回原数据的每一行。
代码实现
set.seed(1234) data <- data.frame(id = rep(100, 10), year = c(rep(2022, 5), rep(2023, 5)), variable = rbinom(10, 1, 0.5)) library(tidyverse) data <- data %>% # 步骤1:计算每个家庭-年份的组内求和 group_by(id, year) %>% mutate(group_sum_per_year = sum(variable)) %>% # 步骤2:切换分组到仅家庭,确保年份按顺序排列(无序数据必须加这步) group_by(id) %>% arrange(year, .by_group = TRUE) %>% # 提取每个年份的唯一求和值,再做累积求和 mutate(goal_calc = cumsum(unique(group_sum_per_year))) %>% # 恢复原分组(可选,不影响最终结果) group_by(id, year) # 查看最终结果 data
结果说明
运行后,goal_calc列会和示例中的goal列完全一致:
- 2022年的累积求和就是当年的组内求和4;
- 2023年的累积求和是2022年的4加上2023年的3,得到7,且该值会填充到2023年的所有行中。
如果原数据中同一家族的年份不是按升序排列,arrange(year, .by_group = TRUE)会确保累积求和是按时间顺序计算的。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

