目前,我有一个包含50,000+行数据的数据集,需要为其查找滚动和。我已经使用rollaply完成了这个过程,它工作得非常完美。我需要应用这些滚动和范围的宽度(600,1200,1800.6000),我已经通过剪切和粘贴每一行脚本和改变宽度。当它工作时,我想整理我的脚本,但是应用一个循环,或者类似的,如果可能的话,这样一旦rollapply函数完成了600宽度的第一次'pass‘,它就会完成同样的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个宽度,然后需要运行这个跨其他科尔。任何帮助都将不胜感激。
发布于 2020-10-01 00:38:35
我们可以在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)))发布于 2020-10-01 00:52:55
与在全局环境中创建单独的向量不同,您可能可以将它们作为新列添加到已经存在的dataframe中。
请注意,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 6000https://stackoverflow.com/questions/64147602
复制相似问题