我需要创建 r.The 中一列的接下来 7 天值的总和 sum 应该由另一个具有字符串值的列分组

I need to create the sum of next 7 days values of a column in r.The sum should be grouped by another column which has string values

我需要创建 r.The 中某列的接下来 7 天值的总和,总和应按具有字符串值的另一列分组

例子

name   value 
a       2    
a       3  
a       3  
b       4  
b       3  
b       2  
b       1  
b       3  

将下一行相加

输出

sum
5
6
3
7
5
3     
4
3

您可以使用 lead()lag() 来引用下一个和上一个值。

此代码将当前和下一个相加,按字符串值分组:

library(dplyr)

df <- data.frame(stringsAsFactors=FALSE,
          V1 = c("a", "a", "a", "b", "b", "b", "b", "b"),
          V2 = c(2L, 3L, 3L, 4L, 3L, 2L, 1L, 3L)
)

df

df %>% 
  group_by(V1) %>% 
  mutate(sum_forward = dplyr::lead(V2) + V2)

这是输出。 NA 在那里是因为在最后一天,没有第二天可以总结。

  V1       V2 sum_forward
  <chr> <int>       <int>
1 a         2           5
2 a         3           6
3 a         3          NA
4 b         4           7
5 b         3           5
6 b         2           3
7 b         1           4
8 b         3          NA

zoo 软件包专为此类任务而设计。

library(zoo)

df1$new <- unlist(tapply(df1$value, factor(df1$name), function(x){ zoo::rollsum(x, 2, align = "left", fill = x[length(x)]) }))

#> df1$new
#[1] 5 6 3 7 5 3 4 3

df1 <- data.frame(stringsAsFactors=FALSE,
                  name = c("a", "a", "a", "b", "b", "b", "b", "b","c","d","d","d"),
                  value = c(2L, 3L, 3L, 4L, 3L, 2L, 1L, 3L, 4L, 1L:3L)
)

windowSize = 3

df1$new <- unlist(
    tapply(df1$value, factor(df1$name),function(x){
        IND <- (length(x)-(windowSize-2)):length(x);IND = IND[IND > 0]
        c(  zoo::rollsum(x, windowSize, align = "left"), rev(cumsum(rev(x[IND])))  )})
    )

做起来有点棘手:

这里是关于给定 windowSize 的公式。