我目前有一个包含50,000多行数据的数据集,我需要为其查找滚动总和。我已经使用rollaply
完成了此工作,效果很好。我需要将这些滚动总和应用于一定范围的宽度(600、1200、1800 ... 6000),这是通过剪切和粘贴脚本的每一行并更改宽度来完成的。当它起作用时,我想整理我的脚本,但应用循环或类似的操作,如果可能的话,以便一旦rollapply
函数完成后,它首先以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个宽度,然后需要在其他列中运行时。任何帮助将不胜感激。
答案 0 :(得分:2)
我们可以在lapply
中使用base R
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)))
答案 1 :(得分:0)
您可能无需在全局环境中创建单独的向量,而可以将它们作为新列添加到已存在的数据框中。
请注意,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
来生成可变的窗口大小。
seq(600, 6000, 600)
#[1] 600 1200 1800 2400 3000 3600 4200 4800 5400 6000