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

在R中按NOC、NAICS、Region分组计算三年周期求和

按分组计算三年周期Value求和的解决方案

问题描述

现有仅含年度数据的数据框,需按NOC、Region、NAICS列分组,计算组内三年周期的Value总和,最终仅在每组最早年份的行显示该总和,其余行显示NA。

原始数据框

NOCRegionNAICSDateYearValue
0000EastAA201012/31/20103
0000EastAA201112/31/20114
0000EastAA201212/31/20120
0000WestBB201012/31/2010100
0000WestBB201112/31/2011200
0000WestBB201212/31/2012200
0000NorthCC201012/31/2010-23
0000NorthCC201112/31/20113
0000NorthCC201112/31/201120

期望生成的新数据框

NOCRegionNAICSDateYearValueSum
0000EastAA201012/31/201037
0000EastAA201112/31/20114NA
0000EastAA201212/31/20120NA
0000WestBB201012/31/2010100500
0000WestBB201112/31/2011200NA
0000WestBB201212/31/2012200NA
0000NorthCC201012/31/2010-230
0000NorthCC201112/31/20113NA
0000NorthCC201112/31/201120NA

尝试的R代码(无法正常运行)

df %>%
  group_by(NOC, Region,  NAICS, Date) %>%
  mutate(max = rollapplyr(Value, 1:n() - findInterval(date - 5, Date), sum)) %>%
  slice_max(max) %>%
  ungroup %>%

可行解决方案

思路

  1. 按NOC、Region、NAICS分组,计算每组的Value总和
  2. 标记每组中最早的年份(Date最小的记录)
  3. 仅在每组最早年份的行显示总和,其余行填充NA

代码实现

library(dplyr)

# 确保Date列为数值型,保证年份比较准确性
df$Date <- as.numeric(df$Date)

result_df <- df %>%
  group_by(NOC, Region, NAICS) %>%
  mutate(
    total_sum = sum(Value, na.rm = TRUE),  # 计算组内所有Value的总和
    is_first_year = Date == min(Date)      # 判断当前行是否为组内最早年份
  ) %>%
  mutate(
    Sum = ifelse(is_first_year, total_sum, NA)  # 仅最早年份行显示总和
  ) %>%
  select(-total_sum, -is_first_year) %>%  # 移除中间辅助列
  ungroup()

print(result_df)

代码说明

  • 先转换Date为数值型,避免字符型年份比较出错
  • 分组计算组内总和,同时标记最早年份的记录
  • 通过条件判断控制总和的显示位置,其余行设为NA
  • 最后清理辅助列,得到符合需求的结果

内容的提问来源于stack exchange,提问作者user15032839

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:25:03