2013-04-23 168 views
3

我從服務器中檢索一些數據,並獲取大約200個不同長度的時間序列對象。這是不可操作的,所以想將它們合併成一個對象,並在沒有可用數據的位置寫入NA。同樣對於每個系列我都有一個以上的變量。我嘗試了一個循環,但仍然不起作用,必須有一個更優雅的方式來排序。比如假設我有以下幾點:如何合併許多不同長度的時間序列R

library(zoo) 
    a=zoo(matrix(rnorm(300), 100, 3),Sys.Date()-100:1) 
    b=zoo(matrix(rnorm(375), 125, 3),Sys.Date()-125:1) 
    c=zoo(matrix(rnorm(525), 175, 3),Sys.Date()-175:1) 
    d=zoo(matrix(rnorm(450), 150, 3),Sys.Date()-150:1) 
    e=list(a,b,c,d) 
    z=do.call(merge,e) 

編輯:這個作品

+0

@Joshua Ulrich感謝您的回覆。是的,這個例子的作品,但請注意,我正在檢索超過200個系列。如果沒有其他辦法,我會這樣做,但也許有創建一個列表或類似的替代方案。 – nopeva 2013-04-23 19:39:25

+0

如果'file.names'是一個包含文件名的字符向量,那麼'z < - read.zoo(file.names,...其他參數...)'會將它們全部讀入併合並它們以產生'z '。 – 2013-04-23 20:21:13

回答

4

您可以merge一起使用do.call。它迭代地合併動物園時間序列列表。

do.call(merge,list(a,b,c,d)) 

我認爲缺失的值應該用NAs填充。

+0

謝謝!我只編輯了代碼。我嘗試過,但不知道如何從一個特定的系列中提取一個特定的變量,稱爲b系列的第二個變量。 – nopeva 2013-04-23 20:12:09

+0

請檢查您的動物園對象列表中是否有重複的名稱。如果是這樣,'do.call(merge,...)'會產生一些奇怪的colnames。您可以在合併之前分配唯一的colname,也可以在合併操作後處理colname。 – cryo111 2013-04-24 01:07:01

+0

這就是我的意思:'圖書館(動物園); a =動物園(data.frame(a = rnorm(10,0,0.1)),1:10); b = zoo(data.frame(b = rnorm(10,0,0.1)),1:10); do.call(merge,list(a,b)); (最後一行產生奇怪的colnames,因爲原始的colname不是唯一的(即,兩者都是'a')。 – cryo111 2013-04-24 01:10:53

1

如果要將動物園對象添加爲新列,cbind功能就是您的朋友。

data <- cbind(a,b,c,d) 

動物園對象的美麗是,他們可以是衣衫襤褸。因此,當時間序列長度不同時,NA值會自動返回。此外,動物園有一個很好的多變量時間序列自動繪圖功能,以及其他許多事情:

plot(data)