r中的子集时间序列

时间:2013-05-30 10:05:35

标签: r subset

我在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

我在这里做错了什么?

感谢您的帮助

1 个答案:

答案 0 :(得分: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,要么将其转换回ts课程:as.ts(zz)

3) na.contiguous 命令(见?na.contiguous)将找到最长的非NA。

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

根据NA的位置,可能会或可能不会给你你想要的东西。在这个例子的情况下,它似乎不是你想要的,但在你的真实例子中,如果它只包含一些初始的NAs,那就没关系。

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

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)

注意:将来,请按照此处讨论的可复制形式提出问题:How to make a great R reproducible example?

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

更新2:更正了na.contiguous

的拼写