2017-04-01 1 views
0

Je suis en train de convertir mon script pour utiliser xts plutôt qu'un cadre de données, mais je suis bloqué en effectuant des calculs sur des éléments de différentes lignes/colonnes.Ajouter des éléments dans xts

En réalité, je parcours les lignes df en utilisant une boucle for, et en utilisant if-elses sur la base du calcul.

Mais, pour simplifier le problème, je peux dire ajouter Col rang 1 avec Col B Row 2 très bien dans une df, mais pas dans un XTS .... voici quelques exemples de code:

> df <- data.frame(c(1:3),c(4:6)) 
> names(df) <- c('colA','colB') 
> df 
    colA colB 
1 1 4 
2 2 5 
3 3 6 
> df$colA[1] + df$colB[2] 
[1] 6 
> 
> 
> library(xts) 
> x <- xts(df, order.by=as.Date(1:3)) 
> x 
      colA colB 
1970-01-02 1 4 
1970-01-03 2 5 
1970-01-04 3 6 
> x$colA[1] + x$colB[2] 
Data: 
integer(0) 

Index: 
numeric(0) 
> 

Des idées comment je peux faire fonctionner ça?

Répondre

1

Lorsque deux objets xts sont ajoutés, ils sont fusionnés pour aligner les heures, puis ajoutés. Les lignes 1 et 2 n'ont pas d'index communs, de sorte que la fusion produit un objet vide.

Voici quelques alternatives:

1) [[ Un seul [ retournera un autre XTS objet mais [[ ne sera pas évitant ainsi le problème:

x$colA[[1]] + x$colB[[2]] 
## [1] 6 

2) CoreData Essayez explicitement conversion en vecteurs ordinaires avant d'ajouter:

coredata(x$colA)[1] + coredata(x$colB)[2] 
## [1] 6 

3) c Ici, nous allons concaténer les deux valeurs dans un nouvel objet xts, puis additionner les valeurs dans ce nouvel objet.

sum(c(x$colA[1], x$colB[2])) 
## [1] 6 
+0

Brilliant! merci beaucoup pour les réponses et les explications. À la vôtre, simmo. – simmo

+0

@simmo: S'il vous plaît voir [Que dois-je faire quand quelqu'un répond à ma question?] (Http://stackoverflow.com/help/someone-answers). –

+0

l'ai eu, trié .... merci @JoshuaUlrich – simmo