Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R前一周总计_R_Sum - Fatal编程技术网

R前一周总计

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-

我有日期(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-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))