2013-11-14 223 views

回答

8

你可以嘗試?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 
+0

謝謝您的回答。有沒有其他解決方案沒有使用嵌入?我有一個50,000個元素的列表。不會嵌入慢? – Sumit

+0

@Sumit:你可以使用'filter';請參閱我的編輯(你是對的:'embed'創建一個新的矩陣,對於大型數據集,內存分配可能會很慢)。 – sgibb

+0

用於'filter'。這是我最喜歡的功能之一。 – Roland

6

你甚至可以使用兩種rollapplyrollmean從動物園包

> 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 
2

這是第四種方式,使用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 
+0

+1的基準。 – Roland