2017-12-09 22 views
0

를 반환, 여기은 내가 데이터 테이블 TT 만들려면이 코드를 사용하고 R. 롤링 합계를 계산하고 싶습니다의 NA

TT <- data.table(ID=c(rep(100,9),rep(200,6)),date=seq(as.Date("1958-04-25"),as.Date("1958-05-9"),by="days"), 
      output=c(5,8,NA,6,7,8,NA,12,13,2,14,12,14,14,NA)) 

내가 롤링 합계를 계산하기 위해 노력을하지만, 결과도 제 케이스 (ID)에 불구하고, 길이가되어야 만의 NA이다> 제

TT[,XX := 
ifelse(length(output) >= 7, 
     rollapply(output, 7, sum, na.rm = TRUE,align = "right",fill = NA_real_), 
     rep(NA_real_,length(output))),by=ID] 

TT[,length(output),by=ID] 

내가 가능한 ID에 따라, (7)의 창 압연 합을 계산한다 싶지 . ID 당 가능한 (행이 충분하지 않은 경우) ID가 없으면 NA 만 갖기를 원합니다. 저는 다른 솔루션에 대해서도 열려 있습니다.

+0

zoo 개발 버전은'width ='인수보다 짧은 시리즈를 처리 할 수 ​​있습니다. 'install.packages ("zoo", repos = "http://R-Forge.R-project.org"); TT [, XX : = rollapplyr (출력, 7, 합, na.rm = TRUE, 채우기 = NA_real_) by = ID] ' –

+0

오 대단합니다! 힌트를 가져 주셔서 감사합니다. – EDC

답변

0

ifelse 대신 ifelse을 사용할 수 있습니다. ifelse(test, yes, no)test과 같은 모양의 값을 반환하지만 결과의 모드는 test 값에 따라 달라질 수 있습니다.

TT[, XX := if(length(output) >= 7) rollapply(output, 7, sum, na.rm = TRUE, align = "right", fill = NA_real_) else rep(NA_real_, length(output)), by = ID] 

    ID  date output XX 
1: 100 1958-04-25  5 NA 
2: 100 1958-04-26  8 NA 
3: 100 1958-04-27  NA NA 
4: 100 1958-04-28  6 NA 
5: 100 1958-04-29  7 NA 
6: 100 1958-04-30  8 NA 
7: 100 1958-05-01  NA 34 
8: 100 1958-05-02  12 41 
9: 100 1958-05-03  13 46 
10: 200 1958-05-04  2 NA 
11: 200 1958-05-05  14 NA 
12: 200 1958-05-06  12 NA 
13: 200 1958-05-07  14 NA 
14: 200 1958-05-08  14 NA 
15: 200 1958-05-09  NA NA