这个问题已经在这里有一个答案:
- 集料的一周中的R 1个回答
我有日期(列B)和道达尔(A列)变量 - 如何创建R中,总结过去7天的值得彩民的一个新的变量?
在Excel中,我有以下公式:
=SUMIFS($A:$A,$B:$B, ">="&$B20-7,$B:$B,"<"&$B20)
我只是不知道如何转换这在R.建议工作?
这个问题已经在这里有一个答案:
我有日期(列B)和道达尔(A列)变量 - 如何创建R中,总结过去7天的值得彩民的一个新的变量?
在Excel中,我有以下公式:
=SUMIFS($A:$A,$B:$B, ">="&$B20-7,$B:$B,"<"&$B20)
我只是不知道如何转换这在R.建议工作?
这将做到这一点,先进的,但短期 - 本质上是一个衬垫。
# 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))
改变变量名,以匹配所带来的问题。
它还可以处理任何顺序和每天多个条目的数据。
编辑补充意见,使之适合在一个窗口。
如果每天一个总的是,该功能可帮助:
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
这将需要两个参数,以总计多少天,你想在每一个和载体。
dput(df1)
structure(list(Total = c(3L, 8L, 4L, 7L, 6L, 1L, 10L, 9L, 2L,
5L), Date = structure(c(16436, 16436, 16437, 16438, 16439, 16439,
16440, 16441, 16442, 16443), class = "Date")), .Names = c("Total",
"Date"), row.names = c(NA, -10L), class = "data.frame")
如果您运行与在同一天多个值的情况下,这里有一个解决方案。 出人意料的是,@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))
}
它使用rollSums
我之前使用。 直到所需的天分组开始它会吐出来港定居。 这可能是比其他答案唯一的优势。 但是,他们可以很容易地编辑在,我敢肯定。 只是提供参考更多的选择。
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