【问题标题】:How do I merge a large list of xts objects via loop / function in R?如何通过 R 中的循环/函数合并大量 xts 对象?
【发布时间】:2011-09-16 19:27:56
【问题描述】:

我有一个循环,通过调用 API 来提取约 200 个单独的时间序列。

循环将时间序列作为 xts 对象 (library(xts)) 输出到后缀为“.oc”的全局环境中。所以我有 200 个 xts 对象,形式为“ABC.oc”、“ABD.oc”等。每个对象包含 1000 行数据。

我想做的是编写一个循环(或使用适当的函数)来获取所有“*.oc”对象并按列合并它们。 IE 最终会得到:

Date           ABC.oc    ABD.oc -> 200 columns like this
2011-01-01      10         10
2011-01-02      20         20
2011-01-03      30         30
2011-01-04      40         40
2011-01-05      50         50

有一个简短的时间序列列表,只需写:

m <- merge(ABC.oc,ABD.oc,all=FALSE)

但显然这对于​​ 200 个单独的对象是不切实际的,所以我想编写一个循环来像“合并”那样将所有这些对象粉碎在一起。

很容易通过for i in length(ls(pattern="*.oc")){ 访问循环的变量,但无法弄清楚循环的其余部分。 我试过 cbind,但似乎不能正确。

非常感谢任何帮助

【问题讨论】:

    标签: r time-series xts


    【解决方案1】:

    这可以通过获取名称以.oc 结尾的所有对象的字符向量,将它们放在一个列表中,然后通过do.call 调用merge 来实现。

    # Make up some data
    set.seed(21)
    x.oc <- xts(rnorm(10), Sys.Date()-10:1)
    y.oc <- xts(rnorm(10), Sys.Date()-10:1)
    z.oc <- xts(rnorm(10), Sys.Date()-10:1)
    x <- y <- z <- 1:10
    
    objNames <- ls(pattern="*oc$")    # object names
    objList <- lapply(objNames, get)  # list of objects
    names(objList) <- objNames        # assign names to list
    do.call(merge, objList)           # merge all objects in list
    

    如果您在从 API 接收 xts 对象时将它们加载到列表 (objList) 中,则使用此方法会更容易。那么你只需要do.call(merge, objList)

    【讨论】:

    • 据我所知,x &lt;- y &lt;- z &lt;- 1:10 在这里是不必要的。
    • @jbaums:它们代表全局环境中与所需对象的模式不匹配的潜在对象。
    【解决方案2】:

    这样的循环应该可以工作。不过,首先初始化它总是一个好主意。

    library(xts)
    
    m <- xts(matrix(vector(length=length(ls(pattern="*.oc")) * 
      nrow(get(ls(pattern="*.oc")[1]), ncol=nrow(get(ls(pattern="*.oc")[1])), 
      order.by=index(get(ls(pattern="*.oc")[1]))
    
    for (i in 1:length(ls(pattern="*.oc"))) {
      m[, i]  <- get(ls(pattern="*.oc")[i])
    }
    

    【讨论】:

    • 这很棒 - 将尝试一下。如果我想将长度从 1000 行概括为任意/动态长度,你会建议什么?
    • @n.e.w 我所做的编辑将概括对象的数量和它们拥有的行数
    猜你喜欢
    • 2015-11-18
    • 2012-08-15
    • 2013-09-04
    • 1970-01-01
    • 2020-09-22
    • 2021-05-31
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多