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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:44:52