下面是一個列表。如何計算每三個連續元素的平均值
1 2 3 4 5 6 7 8 9 10.
我想計算每三個連續元素的平均值。例如,輸出將是NA NA 2 3 4 5 6 7 8 9.
如何做到這一點?
問候
下面是一個列表。如何計算每三個連續元素的平均值
1 2 3 4 5 6 7 8 9 10.
我想計算每三個連續元素的平均值。例如,輸出將是NA NA 2 3 4 5 6 7 8 9.
如何做到這一點?
問候
你可以嘗試?embed
和?rowMeans
:
v <- 1:10
m <- embed(v, 3)
m
# [,1] [,2] [,3]
#[1,] 3 2 1
#[2,] 4 3 2
#[3,] 5 4 3
#[4,] 6 5 4
#[5,] 7 6 5
#[6,] 8 7 6
#[7,] 9 8 7
#[8,] 10 9 8
rowMeans(m)
# 2 3 4 5 6 7 8 9
編輯:另一個解決方案是?filter
:
filter(x=v, filter=rep(1/3, 3), sides=1)
# Time Series:
# Start = 1
# End = 10
# Frequency = 1
# [1] NA NA 2 3 4 5 6 7 8 9
你甚至可以使用兩種rollapply
或rollmean
從動物園包
> library(zoo)
> v <- 1:10
> rollapply(v, width=3, align="right", FUN=mean, fill=NA)
[1] NA NA 2 3 4 5 6 7 8 9
> rollmean(v, k=3, align="right", fill=NA)
[1] NA NA 2 3 4 5 6 7 8 9
這是第四種方式,使用lag
功能:
v <- 1:10
rowMeans(do.call(cbind, lapply(0:2, lag, x=as.ts(v))))
# [1] NA NA 2 3 4 5 6 7 8 9 NA NA
可以在na.omit
包裝這個刪除NA
秒。
基準
library(microbenchmark)
library(zoo)
v <- 1:10000
f.embed <- function() rowMeans(embed(v, 3))
f.filter <- function() filter(x=v, filter=rep(1/3, 3), sides=1)
f.lag <- function() rowMeans(do.call(cbind, lapply(0:2, lag, x=as.ts(v))))
f.rollmean <-function() rollapply(v, width=3, align="right", FUN=mean, fill=NA)
microbenchmark(f.embed(), f.filter(), f.lag(), f.rollmean())
# Unit: microseconds
# expr min lq median uq max neval
# f.embed() 486.7 499.8 505.6 517.1 1633.1 100
# f.filter() 285.3 300.7 307.2 316.6 912.5 100
# f.lag() 1601.6 1640.9 1677.0 2188.3 2838.7 100
# f.rollmean() 4265.4 4853.5 4902.0 5364.8 52098.9 100
+1的基準。 – Roland
謝謝您的回答。有沒有其他解決方案沒有使用嵌入?我有一個50,000個元素的列表。不會嵌入慢? – Sumit
@Sumit:你可以使用'filter';請參閱我的編輯(你是對的:'embed'創建一個新的矩陣,對於大型數據集,內存分配可能會很慢)。 – sgibb
用於'filter'。這是我最喜歡的功能之一。 – Roland