R: do.call with merge and eapply



我正在合并两个具有join="左";即(左侧对象中的所有行以及右侧匹配的行(。我在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

最新更新