2

我在 r 中对时间序列对象进行子集化时遇到了一些麻烦。

1.我将一个csv文件导入R如下(在excel中删除日期列后)

sz.bm.df <- read.csv('size_book_25.csv',header=T)

2.csv文件1038行25列,缺失值用-99.99指定

3.然后我创建了一个具有自定义日期范围的时间序列对象,如下所示

szbm.ts.data <- ts(data=sz.bm.df,start=c(1926,7),frequency=12)

4.现在我想处理缺失值问题(我遇到了这个问题)。我想从时间序列对象中创建一个子集,该子集从我们找到 -99.99 的最后一行开始,直到原始对象的结尾。我尝试了以下方法来提取要找到缺失值的日期:

time(szbm.ts.data[which(szbm.ts.data==-99.99)])

但是,这给了我一组日期,而不是给我:

 [1]  1  2  3  4  5  6  7  8  9 10 11 12

attr(,"tsp") [1] 1 12 1

我在这里做错了什么?

感谢您的任何帮助

4

1 回答 1

4

以下是一些替代方案:

1) 使用窗口命令(见?window

tt <- ts(c(1:5, -99, 6:9), start = 2000, freq = 12)

t.start <- time(tt)[tail(which(tt == -99), 1)+1]
window(tt, t.start)

2)使用相应的包将您的时间序列表示为zoo 或 xts对象:

library(zoo)

z <- as.zoo(tt)

ix <- tail(which(z == -99), 1) + 1
zz <- z[ix:length(z)]

我们要么继续使用zz,要么将其转换回tsclass: as.ts(zz)

3) na.contiguous命令(请参阅参考资料?na.contiguous)将找到最长的非 NA 段。

tt[tt == -99] <- NA
na.contiguous(tt)

根据NA的位置,这可能会或可能不会给您想要的东西。在此处的示例中,它似乎不是您想要的,但在您的实际示例中,如果它一开始只包含几个 NA,则可能没问题。

对于二维数据,我们可以使用:

m <- matrix(1:24, 6)
m[2,2] <- m[1,4] <- -99
t2 <- ts(m, start = 2000, freq = 12)

# 1
has.na <- apply(t2 == -99, 1, any)
t.start <- time(tt)[tail(which(has.na), 1)+1]
window(t2, t.start)

# 2
library(zoo)
z <- as.zoo(t2)
has.na <- apply(z == -99, 1, any)
ix <- tail(which(has.na), 1) + 1
z[ix:nrow(z)]

# 3
t2[] <- apply(t2, 2, function(x) replace(x, x == -99, NA))
na.contiguous(t2)

注意:将来,请按照此处讨论的可重现形式陈述问题:如何制作一个出色的 R 可重现示例?

更新:还添加了在多元时间序列上执行这些操作的示例。

更新2:更正拼写na.contiguous

于 2013-05-30T10:35:36.430 回答