2011-03-29 31 views
1

我有一個xts對象,我使用to.period()來'上''期間來產生第二個xts對象。然後我將這兩個xts對象組合回更快的時期。我如何設置cbind()以便NA(見下面)被替換並填入最新值?如何在不同週期之間爲XTS添加和填充NA?

require(xts) 
data(sample_matrix) 
x <- as.xts(sample_matrix) 
x.wk <- to.weekly(x) 
x2 <- cbind(x, x.wk[ , 4]) 
print(first(x2, "2 weeks")) 

>head(x2) 
        Open  High  Low Close x.Close 
    2007-01-02 50.03978 50.11778 49.95041 50.11778  NA 
    2007-01-03 50.23050 50.42188 50.23050 50.39767  NA 
    2007-01-04 50.42096 50.42096 50.26414 50.33236  NA 
    2007-01-05 50.37347 50.37347 50.22103 50.33459  NA 
    2007-01-06 50.24433 50.24433 50.11121 50.18112  NA 
    2007-01-07 50.13211 50.21561 49.99185 49.99185 49.99185 
    2007-01-08 50.03555 50.10363 49.96971 49.98806  NA 
    2007-01-09 49.99489 49.99489 49.80454 49.91333  NA 
    2007-01-10 49.91228 50.13053 49.91228 49.97246  NA 
    2007-01-11 49.88529 50.23910 49.88529 50.23910  NA 
    2007-01-12 50.21258 50.35980 50.17176 50.28519  NA 
    2007-01-13 50.32385 50.48000 50.32385 50.41286  NA 
    2007-01-14 50.46359 50.62395 50.46359 50.60145 50.60145 

>head(x3) # this is what I want instead 
        Open  High  Low Close x.Close 
    2007-01-02 50.03978 50.11778 49.95041 50.11778  NA 
    2007-01-03 50.23050 50.42188 50.23050 50.39767  NA 
    2007-01-04 50.42096 50.42096 50.26414 50.33236  NA 
    2007-01-05 50.37347 50.37347 50.22103 50.33459  NA 
    2007-01-06 50.24433 50.24433 50.11121 50.18112  NA 
    2007-01-07 50.13211 50.21561 49.99185 49.99185 49.99185 
    2007-01-08 50.03555 50.10363 49.96971 49.98806 49.99185 
    2007-01-09 49.99489 49.99489 49.80454 49.91333 49.99185 
    2007-01-10 49.91228 50.13053 49.91228 49.97246 49.99185 
    2007-01-11 49.88529 50.23910 49.88529 50.23910 49.99185 
    2007-01-12 50.21258 50.35980 50.17176 50.28519 49.99185 
    2007-01-13 50.32385 50.48000 50.32385 50.41286 49.99185 
    2007-01-14 50.46359 50.62395 50.46359 50.60145 50.60145 

謝謝!

回答

3

你只需要使用na.locf你已經合併了後兩對象。

> head(na.locf(x2),15) 
       Open  High  Low Close x.Close 
2007-01-02 50.03978 50.11778 49.95041 50.11778  NA 
2007-01-03 50.23050 50.42188 50.23050 50.39767  NA 
2007-01-04 50.42096 50.42096 50.26414 50.33236  NA 
2007-01-05 50.37347 50.37347 50.22103 50.33459  NA 
2007-01-06 50.24433 50.24433 50.11121 50.18112  NA 
2007-01-07 50.13211 50.21561 49.99185 49.99185 49.99185 
2007-01-08 50.03555 50.10363 49.96971 49.98806 49.99185 
2007-01-09 49.99489 49.99489 49.80454 49.91333 49.99185 
2007-01-10 49.91228 50.13053 49.91228 49.97246 49.99185 
2007-01-11 49.88529 50.23910 49.88529 50.23910 49.99185 
2007-01-12 50.21258 50.35980 50.17176 50.28519 49.99185 
2007-01-13 50.32385 50.48000 50.32385 50.41286 49.99185 
2007-01-14 50.46359 50.62395 50.46359 50.60145 50.60145 
2007-01-15 50.61724 50.68583 50.47359 50.48912 50.60145 
2007-01-16 50.62024 50.73731 50.56627 50.67835 50.60145 
+0

很好。我不知道這個功能。 – kohske 2011-03-30 04:45:44

+0

@kohske:它不在R中;它是動物園包中定義的通用函數,可以解釋爲什麼你不知道它。 – 2011-03-30 04:48:19

2

這裏有兩個例子。

首先是一種功能性的編程方式:

x2$x <- Reduce(function(x,y){ 
    if(is.na(y)) c(x,x[length(x)]) else c(x,y)}, 
    as.numeric(x2$x.Close) 
) 

另是一種程序性的方法:

z <- x2$x.Close 
z1 <- rle(c(is.na(z))) 
z2 <- z1$lengths[z1$values==TRUE] +1 
z3 <- z[!is.na(z)] 

# in the case that first row is NA 
if (is.na(z[1])) { 
    z3 <- c(NA, z3) 
    z2[1] <- z2[1]-1 
    } 

# in the case that the last row is not NA 
if (!is.na(z[length(z)])) z2 <- c(z2, 1) 
z4 <- rep(z3, z2) 
x2$x <- z4 
+0

+1對於一個非常有創意和徹底的答案...即使有一個更容易的選擇。 ;-) – 2011-03-30 04:48:50

+0

@Joshua謝謝,但實際上這是'重新​​發明輪子'。 na.locf是這裏最棒的。 – kohske 2011-03-30 04:52:58

相關問題