다음은 목록입니다.세 연속 요소의 평균을 계산하는 방법
1 2 3 4 5 6 7 8 9 10.
3 개의 연속 요소마다 평균을 계산하고 싶습니다. 예를 들어 출력은 NA입니다. NA 2 3 4 5 6 7 8 9
어떻게 수행할까요?
감사
다음은 목록입니다.세 연속 요소의 평균을 계산하는 방법
1 2 3 4 5 6 7 8 9 10.
3 개의 연속 요소마다 평균을 계산하고 싶습니다. 예를 들어 출력은 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
들 제거 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
+1의 힘을 잊는다. – Roland
감사합니다. 임베드를 사용하지 않고 다른 솔루션이 있습니까? 50,000 개의 요소 목록이 있습니다. 느린 임베디드하지 않겠습니까? – Sumit
@Sumit : 당신은'filter'를 사용할 수 있습니다; 내 편집을 보아라. 그러면 옳다 :'embed'는 새로운 행렬을 만들고 메모리 할당은 큰 데이터 세트의 경우 느려질 수있다. – sgibb
'필터'에 +1. 내가 제일 좋아하는 기능 중 하나입니다. – Roland