gpt4 book ai didi

r - 快速滚动平均值 + 汇总

转载 作者:行者123 更新时间:2023-12-04 22:43:13 33 4
gpt4 key购买 nike

在 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

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

但是,计算仍然需要很长时间(因为我必须计算数千个)。我尝试使用其他选项,即 dplyrdata.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

关于r - 快速滚动平均值 + 汇总,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38917435/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com