使用 data.table 包对 R 中的多个变量进行滚动平均值

问题描述 投票:0回答:3

我想获得我拥有的每个数值变量的滚动平均值。使用 data.table 包,我知道如何计算单个变量。但是我应该如何修改代码,以便它可以一次处理多个变量,而不是修改变量名称并重复此过程多次?谢谢。

假设我还有其他名为“V2”、“V3”和“V4”的数值变量。

require(data.table)
setDT(data)
setkey(data,Receptor,date)
data[ , `:=` ('RollConc' = rollmean(AvgConc, 48, align="left", na.pad=TRUE)) , by=Receptor]

我的示例数据的副本可以在以下位置找到: https://drive.google.com/file/d/0B86_a8ltyoL3OE9KTUstYmRRbFk/view?usp=sharing

我想获得每个受体的“AvgConc”、“TotDep”、“DryDep”和“WetDep”的 5 小时滚动方式。

r data.table moving-average
3个回答
20
投票

根据您的描述,您想要这样的东西,这类似于可以在其中一个data.table小插图中找到的示例:

library(data.table)
set.seed(42)
DT <- data.table(x = rnorm(10), y = rlnorm(10), z = runif(10), g = c("a", "b"), key = "g")
library(zoo)
DT[, paste0("ravg_", c("x", "y")) := lapply(.SD, rollmean, k = 3, na.pad = TRUE), 
   by = g, .SDcols = c("x", "y")]

13
投票

现在,可以使用

frollmean
包中的
data.table
函数来实现这一点。

library(data.table)    
xy <- c("x", "y")
DT[, (xy):= lapply(.SD, frollmean, n = 3, fill = NA, align="center"), 
                                   by = g, .SDcols =  xy]

在这里,我用滚动平均值替换 x 和 y 列。


# Data
set.seed(42)
DT <- data.table(x = rnorm(10), y = rlnorm(10), z = runif(10), 
                                g = c("a", "b"), key = "g")

0
投票

Cliff 没有纠正他的答案,尽管我很久以前就发表了评论,因此提交了基准测试,显示在

frollmean

中正确使用矢量化参数
library(data.table)
set.seed(42)
n = 1e6
DT = data.table(V1 = rnorm(n), V2 = rlnorm(n), V3 = runif(n), g = rep(c("a","b"),n/2), key="g")
vars = c("V1","V2","V3")
library(zoo)
w = 48
align = "left"

roland = function(DT) DT[, paste0("r_", vars) := lapply(.SD, rollmean, k=w, na.pad=TRUE, align=align), by = g, .SDcols = vars]
cliff = function(DT) DT[, paste0("r_", vars) := lapply(.SD, frollmean, n=w, fill=NA, align=align), by = g, .SDcols = vars]                                   
jan = function(DT) DT[, paste0("r_", vars) := frollmean(.SD, n=w, align=align), by = g, .SDcols = vars]

DT1 = copy(DT)
DT2 = copy(DT)
DT3 = copy(DT)
system.time(a1 <- roland(DT1))
#   user  system elapsed 
#  0.776   0.079   0.774
system.time(a2 <- cliff(DT2))
#   user  system elapsed 
#  0.102   0.000   0.029 
system.time(a3 <- jan(DT3))
#   user  system elapsed 
#  0.064   0.000   0.023

all.equal(DT1, DT2)
#[1] TRUE
all.equal(DT1, DT3)
#[1] TRUE

最重要的是,变量越多,

jan
就会比
cliff
更快,因为它们是并行计算的。

© www.soinside.com 2019 - 2024. All rights reserved.