【问题标题】:R: Loading xts series from multiple files into a single blockR:将 xts 系列从多个文件加载到单个块中
【发布时间】:2012-02-02 19:14:02
【问题描述】:

我有以下 R 代码从多个文件加载 xts 时间序列并将它们合并到单个 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 循环?

【问题讨论】:

    标签: r xts rbind


    【解决方案1】:

    我经常使用这样的构造,它避免了显式循环构造。

    策略是首先将文件读入data.frames列表,然后rbind将该列表中的元素一起放入单个data.frame。您大概可以根据自己的情况调整相同的逻辑。

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

    【讨论】:

    • 这似乎有效,但是我在调​​用 lapply 时收到了这些警告消息。这是什么意思?请注意,我在我的版本中使用了一个额外的参数: l = lapply(dates, load.ets.trades, filenames) 警告消息:1:在文件中(文件,“rt”):只有“描述”参数的第一个元素使用 2:在文件中(文件,“rt”):仅使用“描述”参数的第一个元素
    • filenames 是一个列表/向量,但 load.ets.trades 需要一个字符串?将日期[i] 与文件名[i] 一起使用会产生不好的气味。取而代之的是,将它们作为数据框/矩阵中的两列感觉更健壮。 (然后你使用 by() 或 apply(),见stackoverflow.com/questions/1699046/…
    • 正如@DarrenCook 提到的,该警告告诉您,在 lapply 迭代中,load.ets.trades() 正在传递整个filenames 向量。它一次又一次地只使用第一个,并警告您它正在​​这样做。我将使用的解决方案是使用呼叫mapply(),它专为这种情况而设计。您的调用类似于l &lt;- mapply(FUN=load.ets.trades, date=dates, filename=filenames),其中datefilenameload.ets.trades 中形式参数的名称。如果这(或其他)解决了您的问题,请告诉我们。
    • @JoshO'Brien 谢谢!我不知道它是否对罗伯特有帮助,但它帮助我理解了 mapply 旨在解决的问题(远远超过它的帮助页面或我读过的书)!快速测试确认它也可以与数据帧一起使用,如mapply(FUN=load.ets.trades, date=d$dates, filename=d$filenames)
    • @JoshO'Brien 似乎 mapply 正是我所需要的,但我收到一个错误:dimnames(data)
    猜你喜欢
    • 1970-01-01
    • 2018-08-13
    • 2019-12-31
    • 2019-08-06
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多