【问题标题】:How do I make a cumulative sum in R with multiple columns?如何在 R 中使用多列进行累积总和?
【发布时间】:2019-07-25 07:44:24
【问题描述】:

我有一个包含 8 个关键数据变量的大型时间序列数据集。我基本上是在寻找前一年的相同数据并创建一个累积总和。

我有一个可以运行的代码,但是速度非常慢,有没有更有效的方法

我当前的代码运行速度很慢:

编辑:我的代码无法重现。我对此感到抱歉。经过比我现在应该感到自豪的更多的努力。

源数据

Data <- data.frame(
  V1 = rep(1:50, 25*3*20),
  V2 = rep(1:25, each= 50, 3*20),
  V3 = rep(1:3, each=50*25, 20),
  Year = rep(1:20, each=50*25*3),
  YearTotal = rnorm(75000), 
  CumulativeSum = 0)

工作但非常慢的代码

for (i in 1:75000){
  Data$CumulativeSum[i] <- Data$YearTotal[i] +
    ifelse(Data$Year[i] == 1, 0, 
           Data$CumulativeSum[ 
           Data$V1 == Data$V1[i] &
               Data$V2 == Data$V2[i] &
               Data$V3 == Data$V3[i] &
               Data$Year + 1 == Data$Year[i] ])  
}

我的实际代码要长一些,并且有字符和周期变量,我需要 30 多分钟来计算。我在 StackOverflow 上找不到任何类似的问题 - 也许我不知道要搜索什么。我不禁相信一定有更优雅、更快捷的方式来完成它。

【问题讨论】:

  • 您能否提供一个可重现的示例?参见例如here
  • 我将添加可重现的数据。对不起!

标签: r time-series lookup cumulative-sum


【解决方案1】:

你可以使用dplyr来加速你的代码:

library(dplyr)

Data <- Data %>% 
  group_by(V1, V2, V3) %>% 
  arrange(Year) %>% 
  mutate(CumulativeSum = cumsum(YearTotal))

通过按 V1、V2 和 V3 分组,我们确保我们只使用相同的组合。然后我们按年份排列并取 te 累积总和。

或者data.table:

library(data.table)

setDT(Data)
Data[order(Year), CumulativeSum := cumsum(YearTotal), by = .(V1, V2, V3)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-14
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2020-08-11
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多