R:do.call 合并并应用

R: do.call with merge and eapply

我正在用 join="left" 合并两个 xts 对象,即(左侧对象中的所有行,以及右侧匹配的行)。我在 myEnv 中加载了这些对象。

library(quantmod)
myEnv <- new.env()
getSymbols("AAPL;FB", env=myEnv)
[1] "AAPL" "FB"  
MainXTS <- do.call(merge, c(eapply(myEnv, Cl), join = "left"))
head(MainXTS)
           AAPL.Close FB.Close
2007-01-03   2.992857       NA
2007-01-04   3.059286       NA
2007-01-05   3.037500       NA
2007-01-08   3.052500       NA
2007-01-09   3.306072       NA
2007-01-10   3.464286       NA
range(index(myEnv$AAPL))
[1] "2007-01-03" "2020-10-27"
range(index(myEnv$FB))
[1] "2012-05-18" "2020-10-27"

到目前为止,它正在按预期工作,因为上面合并的对象中的时间索引是从 APPL 中提取的。问题是,当我更改代码的顺序以使 FB 排在第一位时,合并的对象仍然从 AAPL 中获取时间索引。

myEnv <- new.env()
getSymbols("FB;AAPL", env=myEnv)
[1] "FB"   "AAPL"
MainXTS <- do.call(merge, c(eapply(myEnv, Cl), join = "left"))
head(MainXTS)
           AAPL.Close FB.Close
2007-01-03   2.992857       NA
2007-01-04   3.059286       NA
2007-01-05   3.037500       NA
2007-01-08   3.052500       NA
2007-01-09   3.306072       NA
2007-01-10   3.464286       NA

我期待从 FB 获取时间索引。有人知道我错过了什么吗?

我认为这与加载对象的顺序相同这一事实有关,在上面的两种情况下都是:

ls(myEnv)
[1] "AAPL" "FB"  

我们可以更改顺序 match

out <-  do.call(merge, c(lapply(mget(ls(myEnv)[match(ls(myEnv),
        c("FB", "AAPL"))], myEnv), Cl), join = "left"))

-输出

head(out)
#           FB.Close AAPL.Close
#2012-05-18    38.23   18.94214
#2012-05-21    34.03   20.04571
#2012-05-22    31.00   19.89179
#2012-05-23    32.00   20.37714
#2012-05-24    33.03   20.19000
#2012-05-25    31.91   20.08178