快速滚动均值+总结

AF7*_*AF7 4 aggregate r dataframe data.table rolling-computation

在R中,我试图使用不同的窗口宽度对一个大矢量(高达400k元素)进行非常快速的滚动均值,然后对于每个窗口宽度,按每年的最大值汇总数据.希望下面的例子很清楚.我已经尝试了几种方法,到目前为止最快的似乎是roll_mean从包RcppRoll中使用运行平均值,并aggregate选择最大值.请注意内存需求是一个问题:下面的版本需要非常少的内存,因为它一次只进行一次滚动均值和聚合; 这是首选.

#Example data frame of 10k measurements from 2001 to 2014
n <- 100000
df <- data.frame(rawdata=rnorm(n),
                 year=sort(sample(2001:2014, size=n, replace=TRUE))
                 ) 

ww <- 1:120 #Vector of window widths

dfsumm <- as.data.frame(matrix(nrow=14, ncol=121))
dfsumm[,1] <- 2001:2014
colnames(dfsumm) <- c("year", paste0("D=", ww))

system.time(for (i in 1:length(ww)) {
  #Do the rolling mean for this ww
  df$tmp <- roll_mean(df$rawdata, ww[i], na.rm=TRUE, fill=NA)
  #Aggregate maxima for each year
  dfsumm[,i+1] <- aggregate(data=df, tmp ~ year, max)[,2]
}) #28s on my machine
dfsumm
Run Code Online (Sandbox Code Playgroud)

这给出了所需的输出:a data.frame15行(2001年至2015年)和120列(窗口宽度),包含每个ww和每年的最大值.

但是,计算时间仍然太长(因为我必须计算数千个).我试图玩弄其他选项,即dplyrdata.table,但我一直无法找到更快,因为我缺少这些软件包的知识的东西.

哪个是最快的方法,使用单个核心(代码已在其他地方并行化)?

Rol*_*and 9

内存管理,即分配和复制,正在以你的方法杀死你.

这是一个data.table方法,通过引用分配:

library(data.table)
setDT(df)
alloc.col(df, 200) #allocate sufficient columns

#assign rolling means in a loop
for (i in seq_along(ww)) 
  set(df, j = paste0("D", i),  value = roll_mean(df[["rawdata"]], 
                                        ww[i], na.rm=TRUE, fill=NA))

dfsumm <- df[, lapply(.SD, max, na.rm = TRUE), by = year] #aggregate
Run Code Online (Sandbox Code Playgroud)