我需要创建 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 的公式。
我需要创建 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 的公式。