2013-05-30 121 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,添加了多變量系列的例子。在提出進一步問題之前,請遵循**註釋**中的說明。 –