如何在 R 中对多列求和?
How do I make a cumulative sum in R with multiple columns?
我有一个包含 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 多分钟来计算。我在 Whosebug 上找不到任何类似的问题——也许我不知道要搜索什么。我不禁相信一定有更优雅、更快速的方法来完成它。
您可以使用 dplyr
来加速您的代码:
library(dplyr)
Data <- Data %>%
group_by(V1, V2, V3) %>%
arrange(Year) %>%
mutate(CumulativeSum = cumsum(YearTotal))
通过按 V1、V2 和 V3 分组,我们确保只使用相同的组合。然后我们按年份排列并取累计和。
或 data.table
:
library(data.table)
setDT(Data)
Data[order(Year), CumulativeSum := cumsum(YearTotal), by = .(V1, V2, V3)]
我有一个包含 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 多分钟来计算。我在 Whosebug 上找不到任何类似的问题——也许我不知道要搜索什么。我不禁相信一定有更优雅、更快速的方法来完成它。
您可以使用 dplyr
来加速您的代码:
library(dplyr)
Data <- Data %>%
group_by(V1, V2, V3) %>%
arrange(Year) %>%
mutate(CumulativeSum = cumsum(YearTotal))
通过按 V1、V2 和 V3 分组,我们确保只使用相同的组合。然后我们按年份排列并取累计和。
或 data.table
:
library(data.table)
setDT(Data)
Data[order(Year), CumulativeSum := cumsum(YearTotal), by = .(V1, V2, V3)]