la concaténation/ temps de fusion de la série (R)
Je xts/zoo objets. chacun a des mesures des différentes variables sur un autre laps de temps. Je veux créer une série chronologique unique comprenant l'ensemble des mesures à tous les temps, avec NAs pour le manque de dates et des combinaisons variables. comment dois-je faire?
exemple artificiel:
library(xts)
x<-cbind(a=1:3,b=3:1)
rownames(x) = as.character(Sys.Date()-1:3)
y<-cbind(a=5:7,c=3:1)
rownames(y) = as.character(Sys.Date()-5:7)
xs=as.xts(x)
ys=as.xts(y)
#now what?
#desired outcome looks like:
a b c
2013-03-10 7 NA 1
2013-03-11 6 NA 2
2013-03-12 5 NA 3
2013-03-14 3 1 NA
2013-03-15 2 2 NA
2013-03-16 1 3 NA
# regular merge looks like that (adding an a.1 variable)
merge(xs,ys)
a b a.1 c
2013-03-10 NA NA 7 1
2013-03-11 NA NA 6 2
2013-03-12 NA NA 5 3
2013-03-14 3 1 NA NA
2013-03-15 2 2 NA NA
2013-03-16 1 3 NA NA
# simple concatenation ignores variable names and looks like that
c(xs,ys)
a b
2013-03-10 7 1
2013-03-11 6 2
2013-03-12 5 3
2013-03-14 3 1
2013-03-15 2 2
2013-03-16 1 3
# so what should I do?
ce qui se passe si
pour ma part c'est ok, si xs "gagne", et les données pertinentes du point de ys est jeté/ignoré. Je suis ouvert à d'autres comportements.
xs
et ys
les deux ont de la valeur pour a
?pour ma part c'est ok, si xs "gagne", et les données pertinentes du point de ys est jeté/ignoré. Je suis ouvert à d'autres comportements.
xts
a un merge
fonction qui n' inner
, outer
, left
et right
fusionne. Mais votre problème n'est pas spécifique à any
d'entre eux. vous aurez à écrire votre propre fonction.
OriginalL'auteur amit | 2013-03-17
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas une solution générale. Mais les œuvres de cet exemple:
Juste rappeler que
cbind.xts
est justemerge.xts
. S, vous pouvez obtenir le même résultat à l'aide demerge
Le problème avec cette solution est que si
ys
etxs
avons des dates incommon, vous avez dupliqué indice de finale de votrexts
objet.Par exemple, si on remplace y :Que vous obtenez , un double indice de
2013-03-14
, Donc im pas sûr que cela validexts
objet.MODIFIER une généralisation de la solution:
vous pouvez voir ma mise à jour. J'ai essayé une généralisation. Cela devrait fonctionner.
Ok. il semble maintenant beaucoup mieux. Je continue à espérer trouver quelque chose de plus simple. Merci.
mee trop. J'espère que vous obtenez quelque chose de plus simple. Peut-être que si @JoshuaUlrich voir cette réponse , il peut proposer la meilleure solution.
combien de xts objets que vous essayez de fusionner?
OriginalL'auteur agstudy
What you want => merge(data.frame(x,d),data.frame(y,d),by=c("d","a"),all=T
)Vous devriez utiliser les données.image et non pas le nom de vecteurs/matrices, voici une solution générale, ce que vous voulez, c'est juste un liner avec une jointure externe complète (à l'oeil ?de fusion)
xts
objet. Ils sont de la matrice.Tout de même... ce qu'il veut, c'est une jointure... c'est ce que des données.cadre de sont pour
merci. Je viens de découvrir que pour dataframes il y a une solution comme vous l'avez fait ci-dessus. le spécifique "par" paramètre n'est pas assez générique, mais il fonctionne sans. le seul inconvénient est que le résultat n'est pas une répétition de l'objet, et il prend un peu plus de commandes pour la convertir à une xts
Le
by
est comme générique, car il peut être, vous pouvez spécifierby.x
etby.y
si les noms sont différents et ils sont dynamiques. Le résultat est undata.frame
une ligne à partir de n'importe quel type que vous voulez...OriginalL'auteur statquant
ok. passé un certain temps à penser à ce sujet. parce que finalement, j'ai besoin de "fusionner" beaucoup de ces dataframes/xts en un seul, et pas seulement la fusion de deux d'entre eux, j'ai pensé que cela a du sens de faire tout cela en une seule étape: créer une grande matrice de toutes les date/var combinaisons. puis le brancher à cette grande matrice de toutes les données de l'observation, objet par objet. le code se présente comme suit (sera heureux de recevoir des commentaires sur elle, et de se sentir libre d'utiliser, sans aucune garantie d'aucune sorte, bien sûr):
OriginalL'auteur amit
Je dirais de les convertir en numérique tableau (comme.numérique(ts)), concaténer avec cbind(ts1,ts2) et ensuite revenir à l'époque de la série, ts(c (.numérique(ts1),comme.numérique(ts2))
OriginalL'auteur Héctor Andrade