将时间序列转换为.NAs

时间:2013-04-21 21:09:13

标签: r xts zoo

我有一个包含NA的多变量zoo时间序列,我想将其转换为季度序列。

df1 <-1:12
df1[df1%%4==0] <- NA
zoo.object  <- zoo(matrix(df1, ncol=2),as.Date("2013-01-01")+(0:5)*35)
colnames(zoo.object) <-c("stock1","stock2")


> zoo.object
           stock1 stock2
2013-01-01      1      7
2013-02-05      2     NA
2013-03-12      3      9
2013-04-16     NA     10
2013-05-21      5     11
2013-06-25      6     NA

理想情况下,我希望在每个季度保留每个股票的早期数据。 我试过。从xts包开始,但问题是它删除了带有NA的行。

> to.quarterly(zoo.object,OHLC = FALSE)
        stock1 stock2
2013 Q1      3      9
2013 Q2      5     11
Warning message:
In to.period(x, "quarters", indexAt = indexAt, name = name, ...) :
  missing values removed from data

我还考虑过使用na.locf,但这会将数据从四分之一传到下一个。 (在2013-04-16(第1季度)的示例库存1中,不应该等于3(因为这是第2季度的值)。reverse na.locf也不起作用,因为它可以从后来携带数字四分之一。

使用我的例子,这就是我想要的:

        stock1 stock2
2013 Q1      1      7
2013 Q2      5     10

1 个答案:

答案 0 :(得分:4)

试试这个

library(xts)
(z <- period.apply(zoo.object, endpoints(zoo.object, "quarters"), 
                    function(x) first(na.locf(x, fromLast=TRUE))))
#           stock1 stock2
#2013-03-12      1      7
#2013-06-25      5     10

根据评论,您可以将索引转换为yearqtr

index(z) <- as.yearqtr(index(z))
z
#         stock1 stock2
#2013 Q1       1      7
#2013 Q2       5     10

或许你更喜欢

index(z) <- as.Date(as.yearqtr(index(z)))
z
#           stock1 stock2
#2013-01-01      1      7
#2013-04-01      5     10