3
votes

I struggled a bit with how to do this concisely. My solution, using matrix(...) works but seems a bit sledge hammer like. Is there a better one?

I have an existing 1-row xts object (D1) and a non-xts vector (E1) that comes from an external source which I want to merge together:

library(quantmod)

getSymbols("SPY")
data = get("SPY")
is.xts(data)

# Extract a single row xts object
D1 = data[1,]
index(D1)
# Get the numerical part as a vector
D1v = as.vector(D1)

# New data from external source to be merged
E1 = c(5,6,7,8,9,10)

# Combine into new vector
G1 = c(D1v, E1)
G1

# This fails, I think because xts treats G1 
# like a 1-column object, not a 1-row object?
testXts1 = xts(G1, order.by = index(D1))

testXts2 = xts(matrix(G1, nrow=1), order.by = index(D1))
index(testXts2)
testXts2

My question here is whether the matrix(G1, nrow=1) construct is the intended way to do this sort of thing, the issue being that xts requires X and index(X) to have the same dimensions.

Thanks!

1
You can save a little typing: xts(t(G1), index(D1))GSee

1 Answers

2
votes

As what you want to do is relatively unusual (having a single row xts is unusual), I think the idiom you have found might be as good as anything else.

The other way I can think of would be to add each column one at a time:

D1$a = 5
D1$b = 6
D1$c = 7
D1$d = 8
D1$e = 9

This gives:

> D1
           SPY.Open SPY.High SPY.Low SPY.Close SPY.Volume SPY.Adjusted a b c d e
2007-01-03   142.25   142.86  140.57    141.37   94807600       122.03 5 6 7 8 9