R前一周总计
我有日期(B列)和总计(A列)变量-如何在R中创建一个新变量,将前七天的总计相加 在Excel中,我有以下公式:R前一周总计,r,sum,R,Sum,我有日期(B列)和总计(A列)变量-如何在R中创建一个新变量,将前七天的总计相加 在Excel中,我有以下公式: =SUMIFS($A:$A,$B:$B,“>=”和$B20-7,$B:$B,”如果每天有一个总数,此函数可能有助于: rollSums <- function(totals, roll) { res <- c() for(i in 1:(length(totals)-roll)) { res <- c(res, sum(totals[0:(roll-
=SUMIFS($A:$A,$B:$B,“>=”和$B20-7,$B:$B,”如果每天有一个总数,此函数可能有助于:
rollSums <- function(totals, roll) {
res <- c()
for(i in 1:(length(totals)-roll)) {
res <- c(res, sum(totals[0:(roll-1)+i]))
}
res
}
df1
Total Date
1 3 2015-01-01
2 8 2015-01-01
3 4 2015-01-02
4 7 2015-01-03
5 6 2015-01-04
6 1 2015-01-04
7 10 2015-01-05
8 9 2015-01-06
9 2 2015-01-07
10 5 2015-01-08
rollSums(df1$Total, 3)
[1] 15 19 17 14 17 20 21
rollSums(df1$Total, 4)
[1] 22 25 18 24 26 22
更新
如果您在同一天遇到多个值的情况,这里有一个解决方案。令人惊讶的是,@MikeWise有一个一行程序可以完成所有这些。请参阅其他答案
grouped.roll <- function(DF, Values, Group, roll) {
totals <- eval(substitute(with(DF, tapply(Values, Group, sum))))
newsums <- rollSums(totals, roll)
data.frame(Group=names(totals), Sums=c(rep(NA, roll), newsums))
}
这也可以做到,先进,但短-基本上是一个班轮
# Initialze some data
date <- seq(as.Date("2001-01-01"),as.Date("2001-01-31"),"days")
tot <- trunc(rnorm(31,100,20))
df <- data.frame(date,tot)
# Now compute week sum by summing a subsetted df for each date
df$wktot <- sapply(df$date,function(x)sum(df[difftime(df$date,x,,"days") %in% 0:-6,]$tot))
#初始化一些数据
日期我不熟悉Excel,但我认为您可能正在zoo
软件包中寻找rollsum
函数。@AlexWoolford:好主意,但只有当他们的数据每天只有一个观察值时,这才有效。zoo::window
可能更合适。每个数据只包含一个观察值一天。我正在查看rollsum
的文档,但我仍然不清楚如何包含仅对前七天求和的标准。更改了变量名并修复了一个拼写错误。回答很好。在一行中投票。我写了一个对天进行分组的文档,但它可以如此简洁,这很好。仍然试图n打包您的代码:)在实践中,最好将向量子集化,而不是整个数据帧。对于大数据帧会更快…现在我想起来了。我添加了一个分组函数。它可以工作,但非常冗长。如果我能够以某种方式合并difftime
,我可能能够缩短。而且对于小于滚动和的组,您不会返回NAs组。它只是增加了第i个元素的天数。我没有考虑。我也从中学到了一些东西。
grouped.roll(df1, Total, Date, 3)
Group Sums
1 2015-01-01 NA
2 2015-01-02 NA
3 2015-01-03 NA
4 2015-01-04 22
5 2015-01-05 18
6 2015-01-06 24
7 2015-01-07 26
8 2015-01-08 21
# Initialze some data
date <- seq(as.Date("2001-01-01"),as.Date("2001-01-31"),"days")
tot <- trunc(rnorm(31,100,20))
df <- data.frame(date,tot)
# Now compute week sum by summing a subsetted df for each date
df$wktot <- sapply(df$date,function(x)sum(df[difftime(df$date,x,,"days") %in% 0:-6,]$tot))