2016-06-06 1 views
0

나는 데이터 프레임이 mydata을 호출하고 난 시차에 대한 롤링 평균을 추가 할 2 현재 나는 아래의 코드로 rollmedianr 사용하고 9까지 (길이가 k 인 롤 미디어를 사용할 수 있습니까?

library(data.table) 
library(zoo) 
library(TTR) 
date = seq(as.Date("2016-01-01"),as.Date("2016-01-10"),"day") 
value =c(1,2,3,4,5,6,7,8,9,10) 
mydata = data.frame (date, value) 
mydata 
setDT(mydata)[, paste0('MED',2:9) := lapply(2:9, function(x) rollmedianr(value, x, fill = rep(NA,x-1))),][] 

     date value MED2 MED3 MED4 MED5 MED6 MED7 MED8 MED9 
1: 2016-01-01  1 NA NA NA NA NA NA NA NA 
2: 2016-01-02  2 2 NA NA NA NA NA NA NA 
3: 2016-01-03  3 3 2 NA NA NA NA NA NA 
4: 2016-01-04  4 4 3 3 NA NA NA NA NA 
5: 2016-01-05  5 5 4 4 3 NA NA NA NA 
6: 2016-01-06  6 6 5 5 4 4 NA NA NA 
7: 2016-01-07  7 7 6 6 5 5 4 NA NA 
8: 2016-01-08  8 8 7 7 6 6 5 5 NA 
9: 2016-01-09  9 9 8 8 7 7 6 6 5 
10: 2016-01-10 10 2 9 3 8 4 7 5 6 

그러나 rollmedianr의 설명에) 함수 "k"는 홀수 여야 결과가 잘못됩니다. 4 열의 MED4는 "3"을 표시하지만 중앙값 (c (1,2,3,4))의 중앙값은 2.5이어야합니다. 나는 짝수 및 홀수 "k"에 대한 적절한 롤링 중간 값을 계산하고 싶습니다.

나는이 작업을 거라고 생각 :

setDT(mydata)[, paste0('Calc',2:9) := lapply(2:9, function(x) rollapply(value,x,FUN="median",align="left"))][] 

그러나 당신이 아래 볼 수는 올바르지 않습니다. "Calc2"는 NA, 1.5,2 등이어야합니다. ......

  date value Calc2 Calc3 Calc4 Calc5 Calc6 Calc7 Calc8 Calc9 
1: 2016-01-01  1 1.5  2 2.5  3 3.5  4 4.5  5 
2: 2016-01-02  2 2.5  3 3.5  4 4.5  5 5.5  6 
3: 2016-01-03  3 3.5  4 4.5  5 5.5  6 6.5  5 
4: 2016-01-04  4 4.5  5 5.5  6 6.5  7 4.5  6 
5: 2016-01-05  5 5.5  6 6.5  7 7.5  4 5.5  5 
6: 2016-01-06  6 6.5  7 7.5  8 3.5  5 6.5  6 
7: 2016-01-07  7 7.5  8 8.5  3 4.5  6 4.5  5 
8: 2016-01-08  8 8.5  9 2.5  4 5.5  7 5.5  6 
9: 2016-01-09  9 9.5  2 3.5  5 6.5  4 6.5  5 
10: 2016-01-10 10 1.5  3 4.5  6 7.5  5 4.5  6 
Warning messages: 
1: In `[.data.table`(setDT(mydata), , `:=`(paste0("Calc", 2:9), lapply(2:9, : 
    Supplied 9 items to be assigned to 10 items of column 'Calc2' (recycled leaving remainder of 1 items). 
2: In `[.data.table`(setDT(mydata), , `:=`(paste0("Calc", 2:9), lapply(2:9, : 
    Supplied 8 items to be assigned to 10 items of column 'Calc3' (recycled leaving remainder of 2 items). 
3: In `[.data.table`(setDT(mydata), , `:=`(paste0("Calc", 2:9), lapply(2:9, : 
    Supplied 7 items to be assigned to 10 items of column 'Calc4' (recycled leaving remainder of 3 items). 
4: In `[.data.table`(setDT(mydata), , `:=`(paste0("Calc", 2:9), lapply(2:9, : 
    Supplied 6 items to be assigned to 10 items of column 'Calc5' (recycled leaving remainder of 4 items). 
5: In `[.data.table`(setDT(mydata), , `:=`(paste0("Calc", 2:9), lapply(2:9, : 
    Supplied 4 items to be assigned to 10 items of column 'Calc7' (recycled leaving remainder of 2 items). 
6: In `[.data.table`(setDT(mydata), , `:=`(paste0("Calc", 2:9), lapply(2:9, : 
    Supplied 3 items to be assigned to 10 items of column 'Calc8' (recycled leaving remainder of 1 items). 

어떤 생각? 고맙습니다.

답변

0

질문에 실제로 결과가 표시되지 않지만 어쩌면 이것이 원하는 것일 수 있습니다. (당신이 왼쪽 정렬 한 후 대신 rollapplyrrollapply을 사용하고 align="left"을 추가 할 경우 - 문제의 하나의 예를 잘 정렬과 왼쪽 다른 용도로 사용하기 때문에 하나는 말할 수 없다.)

setDT(mydata)[, paste0('MED',2:9) := 
       lapply(2:9, rollapplyr, data = value, median, fill = NA),][] 

주는 :

  date value MED2 MED3 MED4 MED5 MED6 MED7 MED8 MED9 
1: 2016-01-01  1 NA NA NA NA NA NA NA NA 
2: 2016-01-02  2 1.5 NA NA NA NA NA NA NA 
3: 2016-01-03  3 2.5 2 NA NA NA NA NA NA 
4: 2016-01-04  4 3.5 3 2.5 NA NA NA NA NA 
5: 2016-01-05  5 4.5 4 3.5 3 NA NA NA NA 
6: 2016-01-06  6 5.5 5 4.5 4 3.5 NA NA NA 
7: 2016-01-07  7 6.5 6 5.5 5 4.5 4 NA NA 
8: 2016-01-08  8 7.5 7 6.5 6 5.5 5 4.5 NA 
9: 2016-01-09  9 8.5 8 7.5 7 6.5 6 5.5 5 
10: 2016-01-10 10 9.5 9 8.5 8 7.5 7 6.5 6 
관련 문제