2017-02-09 5 views
1

나는 데이터를 반복적으로 '이동'한 다음 '행 - 방향'을 요약하여 롤링 윈도우를 구현할 수 있습니다. 그러나 이것은 번거롭고 다른 윈도우 크기로 쉽게 일반화 할 수없는 것처럼 보입니다.data.table을 사용하여 롤링 윈도우 구현하기

#' Generate dummy data 
library(data.table) 
set.seed(42) 
d <- data.table(id=rep(letters[1:2], each=5), time=rep(1:5,times=2), x=sample.int(10,10,replace=T)) 

데이터는 다음과 같습니다

id time x 
a 1 10 
a 2 10 
a 3 3 
a 4 9 
a 5 7 
b 1 6 
b 2 8 
b 3 2 
b 4 7 
b 5 8 

지금 (각 ID에 대한) 지난 2 회에 걸쳐 롤링 '최대'걸릴.

#' Now you want to take the maximum of the previous 2 x values (by id) 
#' I can do this by creating shifted lagged versions 
d[, x.L1 := shift(x,1,type='lag'), by=id] 
d[, x.L2 := shift(x,2,type='lag'), by=id] 
d[, x.roll.max := max(x,x.L1,x.L2, na.rm=2), by=.(id,time)] 

내가 훨씬 더 나은 방법이 가정하고이

id time x x.L1 x.L2 x.roll.max 
a 1 10 NA NA 10 
a 2 10 10 NA 10 
a 3 3 10 10 10 
a 4 9 3 10 10 
a 5 7 9 3 9 
b 1 6 NA NA 6 
b 2 8 6 NA 8 
b 3 2 8 6 8 
b 4 7 2 8 8 
b 5 8 7 2 8 

생성합니다.

+0

패키지 ** 동물원 ** 및 ** RcppRoll **의 다양한 '롤 *'기능을 살펴보십시오. –

+0

@ JoshO'Brien : 죄송합니다. 고정 된 데이터입니다. 나는 동물원과 RcppRoll을 사용하여 게시물을 보았지만 이것은 일종의 data.table에서 잘 작동해야한다고 생각했습니다. – drstevok

+1

당신의 코드는'd [, do.call (pmax, c (shift (x, 0 : 2, type = 'lag'), na.rm = TRUE), by = id]'로 단순화됩니다. RcppRoll과 같은 특수한 롤러보다 여전히 효율적이지 않습니다. – Frank

답변

0

나는 Ulrich의 TTR 패키지를 좋아합니다. 아래에서 최대 값을 알려 드리겠습니다.

TTR::runMax(d$x,2) 
+0

TTR에 대한 멋진 팁은 누락 된 값을 처리하지 않습니다 (불행히도'na.rm = T' 옵션 없음). – drstevok

2

따라서 @Franks suggestiong을 따라 RcppRoll을 방문했습니다.

library(Rcpp) 
d[, x.roll.max := roll_max(x, n=2L, align='right', fill=NA, na.rm=T), by=id] 

그리고 나는이 매우 잘 작동/C b를 data.table에 모든 일을하려고되지 말았어야 같아요.

id time x x.roll.max 
a 1 11 NA 
a 2 12 12 
a 3 4 12 
a 4 10 10 
a 5 8 10 
a 6 7 8 
b 1 9 NA 
b 2 2 9 
b 3 8 8 
b 4 9 9 
b 5 6 9 
b 6 9 9 
+0

'library (Rcpp) 먼저 다음과 같은 오류가 발생했기 때문에'function 'enterRNGScope'패키지 'Rcpp'에 의해 제공되지 않았습니다.'Rcpp '의 함수가? data.table (http://stackoverflow.com/을 참조하십시오. 질문/21657575/what-does-this-mean-in-lme4-function-dataptr-not-package-rcpp # 23020525) – drstevok

관련 문제