簡體   English   中英

R-在多個列上執行Zoo rollapply / rollmean

[英]R - Execute Zoo rollapply/rollmean on multiple columns

我想計算每個15天的滾動平均值(前后)。 這是一個測試框架:

date_list = seq(ymd('2000-01-15'),ymd('2010-09-18'),by='day')
testframe = data.frame(Date = date_list)
testframe$Day = substr(testframe$Date, start = 6, stop = 10)
testframe$V1 = runif(3900, 2.0, 35.0)
testframe$V2 = runif(3900, 5.0, 40.0)
testframe$V3 = runif(3900, -10.0, 10.0)
testframe$V4 = seq(from = 5, to = 45, length.out = 3900)

我知道如何為每個單獨的列計算它:

library(zoo)
rollmean(testframe$V4, 31)
rollapply(testframe$V4, 31, mean)

但是,如何一次為每個列執行此操作? 我認為我必須為此排除“日期和日期”列,但是如何在命令中執行此操作? 在前15天和后15天,如何在帶有NA的舊測試框架中獲得結果?

我嘗試了這個:

testframe[paste0("new_col",1:4)] <- lapply(testframe[,3:6], rollapply, FUN = mean, width = 31)

但這不起作用!

rollmean和rollapply的默認操作是對每個列進行操作。 請查看?rollapply

library(zoo)
rollmeanr(BOD, 2, fill = NA)

給出以下內容,其中rollmean應用於內置BOD的每一列:

     Time demand
[1,]   NA     NA
[2,]  1.5   9.30
[3,]  2.5  14.65
[4,]  3.5  17.50
[5,]  4.5  15.80
[6,]  6.0  17.70

如果僅要將均值應用於某些列,請指定:

if (exists("BOD", .GlobalEnv)) rm(BOD)
BOD[1:2] <- rollmeanr(BOD[1:2], 2, fill = NA)

請注意,如果您擁有除索引列以外的所有數字列,則僅使用Zoo對象而不是嘗試將所有內容強制擬合到data.frame中會比較容易,而data.frames在時間序列上效果不佳。

if (exists("BOD", .GlobalEnv)) rm(BOD)
z <- read.zoo(BOD)
rollmeanr(z, 2)

盡管@ G.Grothendieck的回答在許多方面都更好,但是這里有一些有關您的情況可能出問題的上下文:

testframe[paste0("new_col",1:4)] <- lapply(testframe[,3:6], rollapply, FUN = mean, width = 31)
# Error in mean.default(X[[i]], ...) : 'trim' must be numeric of length one

部分原因是您傳遞了FUN= ,但這也是lapply參數的名稱,因此實際上已在其中使用了它:

testframe[paste0("new_col",1:4)] <- lapply(testframe[,3:6], function(a) mean(a, trim=rollapply, width = 31))

mean的第二個參數是trim= ,在這種情況下正在傳遞函數rollapply ,顯然不正確。

下一步將是

testframe[paste0("new_col",1:4)] <- lapply(testframe[,3:6], function(a) rollapply(a, FUN = mean, width = 31))
# Error in `[<-.data.frame`(`*tmp*`, paste0("new_col", 1:4), value = list( : 
#   replacement element 1 has 3870 rows, need 3900

這是因為單個rollapply不會返回前15個值(最后30個觀察值)。 您可以使用fill=NA來解決此問題:

testframe[paste0("new_col",1:4)] <- lapply(testframe[,3:6], function(a) rollapply(a, FUN = mean, width = 31, fill = NA))
# (no warnings/errors)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM