在R中,我尝试使用不同的窗口宽度对大型矢量(最多40万个元素)进行非常快速的滚动平均,然后针对每个窗口宽度按每年的最大值汇总数据。希望下面的例子很清楚。我尝试了几种方法,到目前为止,最快的方法似乎是使用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
这将提供所需的输出:adata.frame
具有15行(2001年至2015年)和120列(窗口宽度),其中包含每个ww和每年的最大值。
但是,计算仍然需要太长时间(因为我必须计算成千上万个)。我尝试使用其他选项(即dplyr
和)data.table
,但由于我对这些软件包的了解不足,因此无法更快地找到某些东西。
使用单核(代码已经在其他地方并行化),哪种方法是最快的方法?
内存管理,即分配和复制,正在用您的方法杀死您。
这是一个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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句