나는 데이터를 반복적으로 '이동'한 다음 '행 - 방향'을 요약하여 롤링 윈도우를 구현할 수 있습니다. 그러나 이것은 번거롭고 다른 윈도우 크기로 쉽게 일반화 할 수없는 것처럼 보입니다.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
생성합니다.
패키지 ** 동물원 ** 및 ** RcppRoll **의 다양한 '롤 *'기능을 살펴보십시오. –
@ JoshO'Brien : 죄송합니다. 고정 된 데이터입니다. 나는 동물원과 RcppRoll을 사용하여 게시물을 보았지만 이것은 일종의 data.table에서 잘 작동해야한다고 생각했습니다. – drstevok
당신의 코드는'd [, do.call (pmax, c (shift (x, 0 : 2, type = 'lag'), na.rm = TRUE), by = id]'로 단순화됩니다. RcppRoll과 같은 특수한 롤러보다 여전히 효율적이지 않습니다. – Frank