2013-11-14 4 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

'필터'에 +1. 내가 제일 좋아하는 기능 중 하나입니다. – Roland

6

심지어 동물원 패키지

에서 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 
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들 제거 na.omit이 포장 할 수 있습니다.

벤치 마크 답변에 대한

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

관련 문제