Search code examples
rmergextsquantmod

R: do.call with merge and eapply


I am merging two xts objects with join="left" i.e. (all rows in the left object, and those that match in the right). I loaded these objectd in 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"

So far it is working as expected since the time index in above merged object is being picked up from APPL. The issue is that when I change the order of the tickers so that FB comes first, the merged object still picks up time indexes from 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

I was expecting the time index to be picked up from FB. Does any one know what I am missing?

I think this has something to do with the fact that the order of objects being loaded is the same and in both cases above it is:

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

Solution

  • We can change the order with match

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

    -output

    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