2013-07-27 1 views
2

n 일 전의 xts 객체에서 데이터 행을 가져와 n 개의 마침표 행이 없거나 NA으로 채워진 경우 역으로 건너 뜁니다.NA 및 NULL 행을 가로 질러 xts 롤백

다음은 데이터 세트의 예입니다.

require(xts) 
set.seed(1) 

ddf <- data.frame('1m' = rnorm(25), '3m' = rnorm(25)) 
xxd <- xts(ddf, seq(as.Date('2013-07-27'), length.out = 25, by='day')) 
xxd[sample(1:25, 8), ] <- NA 
xxd <- xxd[-sample(1:25, 3), ] 

xts 객체 xxd는 19 년 8 월이나 8월 18일이없는 17 팔월 모든 NA, 그래서 내가 사용이 얻을 함께 뭔가를 해킹 한이 작업을 수행하려면 8월을 다시 16 싶어 환경에 할당함으로써,하지만 이것은 매우 R (또는 매우 기능적으로 보이지 않습니다.) -이 작업을 수행하는 적절한 방법은 무엇입니까?

rewindX <- function(Xts, dayRew = 1) 
{ 
    flipDates <- function(dayRew) 
    { 
     assign('newX', Xts[index(last(Xts)) - dayRew], envir = outXenv) 
     if(!length(which(!is.na(outXenv$newX)))) 
     { 
      dayRew <- dayRew + 1 
      flipDates(dayRew) 
     } 
    } 
    outXenv <- new.env(parent = .GlobalEnv) 
    flipDates(dayRew) 
    return(outXenv$newX) 
} 

는 그래서 rewindX(xxd, 1)을주고 되감기 행을 얻었다.

> rewindX(xxd, 1) 
       X1m  X3m 
2013-08-16 0.9189774 -0.7074952 
> rewindX(xxd, 10) 
        X1m  X3m 
2013-08-08 -0.6212406 -0.0593134 

당신의지도가 크게 감사 :

는 다음 두 가지 예입니다.

답변

2

당신은 이전에 가장 최근의 비 NA 각 NA를 교체하기위한 na.locf

일반 기능을 찾고 있습니다. 그래서 예에서

: 나는 솔루션의 변화에 ​​갔다 결국

set.seed(1) 
ddf <- data.frame('1m' = rnorm(25), '3m' = rnorm(25)) 
xxd <- xts(ddf, seq(as.Date('2013-07-27'), length.out = 25, by='day')) 
xxd[sample(1:25, 8), ] <- NA 
xxc <- na.locf(xxd) 
xxc["2013-08-16/"]    ## 19 to 17 are equal to 16 
        X1m  X3m 
2013-08-16 0.1437715 -0.7767766 
2013-08-17 0.1437715 -0.7767766 
2013-08-18 0.1437715 -0.7767766 
2013-08-19 0.1437715 -0.7767766 
2013-08-20 -0.7970895 0.5767188 
+0

만약 날짜가 존재하지 않으면 어떻게됩니까? 이 사건을 커버하지 않는 것 같습니다. – ricardo

+0

@ricardo 알아요. xts 객체를 누락 된 날짜가 포함 된 벡터와 병합하기 쉽습니다. '## 새로운 인덱스 사용 new.index <- seq (min (index (x)), max (인덱스 (x)), by = as.difftime (1, units = 'days')); x <- merge (x, xts (NULL, new.index))'그렇다면'na.locf'를 적용하십시오 ... – agstudy

+0

솔직히 말해서, 저는 제 솔루션에 keener입니다. 이 문제를 불쾌하게하기 위해'na.locf'와'merge '를 사용하는 것은 비용이 많이 드는 것처럼 보입니다. 나는 환경에 배정하는 것이'R'/functional처럼 보이지 않는지 묻고있다. 더 좋은 방법이있을거야? – ricardo

0

findIntervalna.locf를 사용 @agstudy에 의해 코멘트에 제안했다.

require(xts) 

xd <- xts(rnorm(20), order.by = seq(Sys.Date(), by = 'week', length.out=20)) 

# objective: rewind back n days, filling in NAs with prior observation 
# rewind an xts object by n days 
rewindX_fi <- function(Xts, dayRew=1, fillNA = TRUE, last = TRUE, oldDates = TRUE){ 
    # rewinds an Xts object by dayRew days 
    lastFlip <- function(X) { 
     if(last) { 
      last(X) 
     } else X 
    } 
    stopifnot(is.xts(Xts)) 
    newDates <- index(Xts) - dayRew 
    rewindRows <- findInterval(newDates, index(Xts)) 
    Xts_rew <- xts(rep(NA, nrow(Xts)), 
        order.by = if(oldDates) index(Xts) else newDates) 
    nonZeros <- rewindRows[rewindRows > 0] 
    Xts_rew[rewindRows > 0,] <- if(fillNA) { 
     na.locf(Xts, na.rm = FALSE)[nonZeros,] 
    } else { 
     Xts_rew <- Xts[nonZeros, ] 
    } 
    lastFlip(Xts_rew) 
}