具有可变宽度 R 的滚动功能
rolling function with variable width R
我需要使用不同宽度和偏移的滚动 window 来总结一些数据。特别是我需要对在不同时间间隔记录的某些值应用函数(例如求和)。
这里有一个数据框的例子:
df <- tibble(days = c(0,1,2,3,1),
value = c(5,7,3,4,2))
df
# A tibble: 5 x 2
days value
<dbl> <dbl>
1 0 5
2 1 7
3 2 3
4 3 4
5 1 2
列表示:
days
从上次观察到过去了多少天。第一个值为 0,因为之前没有观察到。
value
我需要聚合的值。
现在,假设我需要每 4 天对字段 value
求和一次,当时偏移 1 天。
我需要这些方面的东西:
days value roll_sum rows_to_sum
0 5 15 1,2,3
1 7 10 2,3
2 3 3 3
3 4 6 4,5
1 2 NA NA
已添加第 rows_to_sum
栏以使其清楚。
这里有更多详细信息:
- 第一个值 (15) 是 3 行的总和,因为 0+1+2 = 3 小于参考值 4,添加下一行(值为 3)将带来总天数数到 7 大于 4。
- 第二个值 (10) 是第 2 行和第 3 行的总和。这是因为,排除第一行(因为我们要换一天),我们只对第 2 行和第 3 行求和,因为包括第 4 行将使天数总和为 1+2+3 = 6,即大于 4.
...
我怎样才能做到这一点?
谢谢
这是一种方法:
library(dplyr)
library(purrr)
df %>%
mutate(roll_sum = map_dbl(row_number(), ~{
i <- max(which(cumsum(days[.x:n()]) <= 4))
if(is.na(i)) NA else sum(value[.x:(.x + i - 1)])
}))
# days value roll_sum
# <dbl> <dbl> <dbl>
#1 0 5 15
#2 1 7 10
#3 2 3 3
#4 3 4 6
#5 1 2 2
在基数 R 中执行此计算:
sapply(seq(nrow(df)), function(x) {
i <- max(which(cumsum(df$days[x:nrow(df)]) <= 4))
if(is.na(i)) NA else sum(df$value[x:(x + i - 1)])
})
我需要使用不同宽度和偏移的滚动 window 来总结一些数据。特别是我需要对在不同时间间隔记录的某些值应用函数(例如求和)。
这里有一个数据框的例子:
df <- tibble(days = c(0,1,2,3,1),
value = c(5,7,3,4,2))
df
# A tibble: 5 x 2
days value
<dbl> <dbl>
1 0 5
2 1 7
3 2 3
4 3 4
5 1 2
列表示:
days
从上次观察到过去了多少天。第一个值为 0,因为之前没有观察到。
value
我需要聚合的值。
现在,假设我需要每 4 天对字段 value
求和一次,当时偏移 1 天。
我需要这些方面的东西:
days value roll_sum rows_to_sum
0 5 15 1,2,3
1 7 10 2,3
2 3 3 3
3 4 6 4,5
1 2 NA NA
已添加第 rows_to_sum
栏以使其清楚。
这里有更多详细信息:
- 第一个值 (15) 是 3 行的总和,因为 0+1+2 = 3 小于参考值 4,添加下一行(值为 3)将带来总天数数到 7 大于 4。
- 第二个值 (10) 是第 2 行和第 3 行的总和。这是因为,排除第一行(因为我们要换一天),我们只对第 2 行和第 3 行求和,因为包括第 4 行将使天数总和为 1+2+3 = 6,即大于 4.
...
我怎样才能做到这一点? 谢谢
这是一种方法:
library(dplyr)
library(purrr)
df %>%
mutate(roll_sum = map_dbl(row_number(), ~{
i <- max(which(cumsum(days[.x:n()]) <= 4))
if(is.na(i)) NA else sum(value[.x:(.x + i - 1)])
}))
# days value roll_sum
# <dbl> <dbl> <dbl>
#1 0 5 15
#2 1 7 10
#3 2 3 3
#4 3 4 6
#5 1 2 2
在基数 R 中执行此计算:
sapply(seq(nrow(df)), function(x) {
i <- max(which(cumsum(df$days[x:nrow(df)]) <= 4))
if(is.na(i)) NA else sum(df$value[x:(x + i - 1)])
})