我需要创建r中一列的未来7天值的总和,该总和应按具有字符串值的另一列分组

时间:2018-10-10 14:19:21

标签: r sum lead

我需要在r中创建一列的接下来7天的值之和。该总和应按具有字符串值的另一列分组

示例

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

总和乘以2下一行

输出

sum
5
6
3
7
5
3     
4
3

2 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:1)

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的公式。