2012-01-04 72 views
2

我有以下的R代碼裏面加載從多個文件XTS的時間序列,並在一個單一的XTS矩陣將它們合併:R:加載XTS系列從多個文件合併爲一個塊

load.files = function(dates, filenames) { 
    for(i in 1:length(dates)) { 
    # load and merge each xts block 
    ts.set = load.single.file(dates[i], filenames[i]) 
    if(i == 1) 
    ts.all = ts.set 
    else 
    ts.all = rbind(ts.all, ts.set) 
} 

return(ts.all) 

有沒有辦法來

  1. 避免初始化第一個ts.set所需的if/else語句?
  2. 完全避免for循環?

回答

3

我經常使用這樣的結構,避免顯式循環結構。

該策略是先將文件讀入data.frames列表中,然後將該列表中的元素合併爲一個data.frame。你大概可以用相同的邏輯來適應你的情況。

filenames <- c("a.csv", "b.csv", "c.csv") 
l <- lapply(filenames, read.csv) 
do.call("rbind", l) 
+0

這似乎工作,但是我得到這些警告消息的電話lapply。這是什麼意思?請注意,我在我的版本中使用了一個額外的參數:l = lapply(日期,load.ets.trades,文件名)警告消息:1:在文件(file,「rt」)中:只有'description'參數的第一個元素使用2:在文件(文件,「rt」)中:只使用'description'參數的第一個元素 – 2012-01-04 23:29:33

+1

文件名是一個列表/矢量,但load.ets.trades期望單個字符串?使用日期[我]與文件名[我]有一個不好的_smell_。而將它們作爲數據幀/矩陣中的兩列感覺更強大。 (然後你使用()或apply(),請參閱http://stackoverflow.com/questions/1699046/foreach-row-in-an-r-dataframe) – 2012-01-05 01:47:54

+2

正如@DarrenCook提到的那樣,警告告訴你,在lapply迭代,'load.ets.trades()'被傳遞給整個'filenames'向量。它只使用第一個,並且一次又一次地警告你它正在這樣做。我使用的解決方案是使用調用'mapply()',這是專爲這種情況而設計的。你的調用看起來像'l < - mapply(FUN = load.ets.trades,date = dates,filename = filenames)',其中'date'和'filename'是'load.ets中形式參數的名字.trades'。請讓我們知道這(或其他)解決您的問題。 – 2012-01-05 05:10:52