为 rollapply 应用循环 windows
Apply loop for rollapply windows
我目前有一个包含 50,000 多行数据的数据集,我需要为其找到滚动总和。我已经使用 rollaply
完成了这个,效果很好。我需要在一系列宽度(600、1200、1800...6000)上应用这些滚动总和,这是我通过剪切和粘贴脚本的每一行并更改宽度来完成的。虽然它有效,但我想整理我的脚本,但如果可能的话应用一个循环或类似的,以便一旦 rollapply
函数完成它首先 'pass' 在 600 宽度,然后完成相同的用1200等等。示例:
Var1 Var2 Var3
1 11 19
43 12 1
4 13 47
21 14 29
41 15 42
16 16 5
17 17 16
10 18 15
20 19 41
44 20 27
width_2 <- rollapply(x$Var1, FUN = sum, width = 2)
width_3 <- rollapply(x$Var1, FUN = sum, width = 3)
width_4 <- rollapply(x$Var1, FUN = sum, width = 4)
有没有办法以更简单的方式 运行 宽度 2、3,然后 4,而不是剪切和粘贴,特别是当我有多达 10 个宽度,然后需要 运行这在其他列中。任何帮助将不胜感激。
我们可以在base R
中使用lapply
lst1 <- lapply(2:4, function(i) rollapply(x$Var1, FUN = sum, width = i))
names(lst1) <- paste0('width_', 2:4)
list2env(lst1, .GlobalEnv)
注意:不建议在全局环境中创建多个对象。相反,list
会更好
或使用 for
循环
for(v in 2:4) {
assign(paste0('width_', v), rollapply(x$Var1, FUN = sum, width = v))
}
创建一个函数来为多个数据集执行此操作
f1 <- function(col1, i) {
rollapply(col1, FUN = sum, width = i)
}
lapply(x[c('Var1', 'Var2')], function(x) lapply(2:4, function(i)
f1(x, i)))
您可以将这些作为新列添加到现有数据框中,而不是在全局环境中创建单独的向量。
请注意 rollaplly(..., FUN = sum)
与 rollsum
相同。
library(dplyr)
library(zoo)
bind_cols(x, purrr::map_dfc(2:4,
~x %>% transmute(!!paste0('Var1_roll_', .x) := rollsumr(Var1, .x, fill = NA))))
# Var1 Var2 Var3 Var1_roll_2 Var1_roll_3 Var1_roll_4
#1 1 11 19 NA NA NA
#2 43 12 1 44 NA NA
#3 4 13 47 47 48 NA
#4 21 14 29 25 68 69
#5 41 15 42 62 66 109
#6 16 16 5 57 78 82
#7 17 17 16 33 74 95
#8 10 18 15 27 43 84
#9 20 19 41 30 47 63
#10 44 20 27 64 74 91
您可以使用 seq
生成变量 window 大小。
seq(600, 6000, 600)
#[1] 600 1200 1800 2400 3000 3600 4200 4800 5400 6000
我目前有一个包含 50,000 多行数据的数据集,我需要为其找到滚动总和。我已经使用 rollaply
完成了这个,效果很好。我需要在一系列宽度(600、1200、1800...6000)上应用这些滚动总和,这是我通过剪切和粘贴脚本的每一行并更改宽度来完成的。虽然它有效,但我想整理我的脚本,但如果可能的话应用一个循环或类似的,以便一旦 rollapply
函数完成它首先 'pass' 在 600 宽度,然后完成相同的用1200等等。示例:
Var1 Var2 Var3
1 11 19
43 12 1
4 13 47
21 14 29
41 15 42
16 16 5
17 17 16
10 18 15
20 19 41
44 20 27
width_2 <- rollapply(x$Var1, FUN = sum, width = 2)
width_3 <- rollapply(x$Var1, FUN = sum, width = 3)
width_4 <- rollapply(x$Var1, FUN = sum, width = 4)
有没有办法以更简单的方式 运行 宽度 2、3,然后 4,而不是剪切和粘贴,特别是当我有多达 10 个宽度,然后需要 运行这在其他列中。任何帮助将不胜感激。
我们可以在base R
lapply
lst1 <- lapply(2:4, function(i) rollapply(x$Var1, FUN = sum, width = i))
names(lst1) <- paste0('width_', 2:4)
list2env(lst1, .GlobalEnv)
注意:不建议在全局环境中创建多个对象。相反,list
会更好
或使用 for
循环
for(v in 2:4) {
assign(paste0('width_', v), rollapply(x$Var1, FUN = sum, width = v))
}
创建一个函数来为多个数据集执行此操作
f1 <- function(col1, i) {
rollapply(col1, FUN = sum, width = i)
}
lapply(x[c('Var1', 'Var2')], function(x) lapply(2:4, function(i)
f1(x, i)))
您可以将这些作为新列添加到现有数据框中,而不是在全局环境中创建单独的向量。
请注意 rollaplly(..., FUN = sum)
与 rollsum
相同。
library(dplyr)
library(zoo)
bind_cols(x, purrr::map_dfc(2:4,
~x %>% transmute(!!paste0('Var1_roll_', .x) := rollsumr(Var1, .x, fill = NA))))
# Var1 Var2 Var3 Var1_roll_2 Var1_roll_3 Var1_roll_4
#1 1 11 19 NA NA NA
#2 43 12 1 44 NA NA
#3 4 13 47 47 48 NA
#4 21 14 29 25 68 69
#5 41 15 42 62 66 109
#6 16 16 5 57 78 82
#7 17 17 16 33 74 95
#8 10 18 15 27 43 84
#9 20 19 41 30 47 63
#10 44 20 27 64 74 91
您可以使用 seq
生成变量 window 大小。
seq(600, 6000, 600)
#[1] 600 1200 1800 2400 3000 3600 4200 4800 5400 6000