2017-01-27 1 views
0

Cela devrait être assez simple pour les programmeurs R vétérans mais je n'arrive pas à trouver une solution en ligne.Erreur avec cbind sur deux objets xts

J'essaye de lier une colonne d'un objet xts sym.rank à la fin d'un deuxième objet existant A mais les résultats augmentent le nombre de rangées. Les données de sym.rank sont essentiellement décalées vers le bas au lieu d'être correctement alignées sur les données de A.

> str(A) 
An ‘xts’ object on 2005-01-31/2012-12-31 containing: 
Data: num [1:96, 1:6] 35.5 33.8 33.6 33.3 31.9 ... 
-attr(*, "dimnames")=List of 2 
..$ : NULL 
..$ : chr [1:6] "XLY.Open" "XLY.High" "XLY.Low" "XLY.Close" ... 
Indexed by objects of class: [Date] TZ: UTC 
xts Attributes: 
List of 2 
$ src : chr "yahoo" 
$ updated: POSIXct[1:1], format: "2017-01-27 00:42:13" 

> str(sym.rank) 
An ‘xts’ object on 2005-01-31/2012-12-31 containing: 
Data: num [1:96, 1:5] NA NA 5 5 4 2 2 3 5 5 ... 
- attr(*, "dimnames")=List of 2 
..$ : NULL 
..$ : chr 
[1:5] "XLY.Adjusted" "XLP.Adjusted" "XLE.Adjusted" "AGG.Adjusted" ... 
Indexed by objects of class: [POSIXct,POSIXt] TZ: 
xts Attributes: 
NULL 

>sym.rank 
     XLY.Adjusted XLP.Adjusted XLE.Adjusted AGG.Adjusted IVV.Adjusted 
2005-01-31   NA   NA   NA   NA   NA 
2005-02-28   NA   NA   NA   NA   NA 
2005-03-31   5   3   1   4   2 
2005-04-30   5   2   4   1   3 
2005-05-31   4   3   5   1   2 
2005-06-30   2   5   1   4   3 

> A 
     XLY.Open XLY.High XLY.Low XLY.Close XLY.Volume XLY.Adjusted 
2005-01-31 35.45 35.55 33.23  33.78 5464600  28.49650 
2005-02-28 33.82 34.36 33.33  33.60 5813500  28.34465 
2005-03-31 33.60 34.40 32.71  33.16 10675600  28.01342 
2005-04-30 33.30 33.47 30.62  31.05 12504000  26.23090 
2005-05-31 31.92 33.18 31.04  32.0  27.85291 
2005-06-30 33.10 33.88 32.68  32.78 7248700  27.73284 

> cbind(A,sym.rank[,1]) 
     XLY.Open XLY.High XLY.Low XLY.Close XLY.Volume XLY.Adjusted XLY.Adjusted.1 
2005-01-30  NA  NA  NA  NA   NA   NA    NA 
2005-01-31 35.45 35.55 33.23  33.78 5464600  28.49650    NA 
2005-02-27  NA  NA  NA  NA   NA   NA    NA 
2005-02-28 33.82 34.36 33.33  33.60 5813500  28.34465    NA 
2005-03-30  NA  NA  NA  NA   NA   NA    5 
2005-03-31 33.60 34.40 32.71  33.16 10675600  28.01342    NA 

Comme vous pouvez le voir, le résultat de la commande cbind introduit des lignes non désirées et les valeurs réelles de sym.rank sont introduit dans les lignes indésirables. Toute aide serait grandement appréciée. Notez la partie "Indexé par des objets ..." de la sortie str().

+0

mon mauvais, trouvé la solution. Ajout de ce qui suit résout le problème: ttz <-Sys.getenv ('TZ') Sys.setenv (TZ = 'UTC') Mais si quelqu'un sait pourquoi, encore ici pour écouter la sagesse – Hysterio

+0

Si vous ne le faites pas fournir un attribut tz vous obtenez votre fuseau horaire actuel. –

+0

Merci beaucoup! – Hysterio

Répondre

0

> str(A) 
#... 
Indexed by objects of class: [Date] TZ: UTC # Date index, UTC timezone 
> str(sym.rank) 
#... 
Indexed by objects of class: [POSIXct,POSIXt] TZ: # POSIXct index, no timezone 

Date objets ne sont pas un fuseau horaire, donc ils sont toujours traités à l'UTC dans l'indice XTS. POSIXct (et POSIXlt) objets toujours avoir un fuseau horaire. Si aucun attribut de fuseau horaire n'est spécifié, le fuseau horaire actuel de votre ordinateur est déterminé et utilisé (la manière dont cela est fait dépend de votre système d'exploitation et de vos paramètres).

Vous ne dites pas comment vous avez créé sym.rank, mais vous l'avez créé avec un index POSIXct. Comme vous ne disposez que de données quotidiennes, vous devez utiliser un index Date à la place. Vous pouvez le convertir via:

index(sym.rank) <- as.Date(index(sym.rank)) 
# now this should work without adding rows 
merge(A, sym.rank)