2013-05-30 71 views
2

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

1.I导入csv文件分为R如下

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

2. csv文件具有1038行和25列(除去在Excel中日期栏以后),缺失值被指定通过-99.99

3.I然后,创建一个时间序列对象与自定义时间范围如下

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)使用窗口命令(见?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)代表时间序列为动物园或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)将找到最长的非NAs区段。

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

这可能会也可能不会给你你想要的东西,取决于NA的位置。在这里的例子中,它似乎不是你想要的,但在你的真实例子中,它可能是好的,如果它在开始时仅由少数NAs组成。

对于2维数据我们可以利用这一点:

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?

UPDATE:还增加了实例在多元时间序列上执行这些操作。

UPDATE 2:更正拼写na.contiguous

+0

谢谢你,我会试试看! – HalfAFoot

+0

我尝试了你的第一个解决方案,但是我得到了** NA **。我试过这个'idx < - time(szbm.ts.data)[tail(which(szbm.ts.data == - 99.99),1)+1]'。当我只尝试下面的尾巴(其中(szbm.ts.data == - 99.99),1)+ 1',我得到了一个非常大的数字** 24973 ** ....帮助! – HalfAFoot

+0

@Half,添加了多变量系列的例子。在提出进一步问题之前,请遵循**注释**中的说明。 –