我需要在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
答案 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的公式。