2010-11-25 38 views
0

Disons que j'ai ce vecteur zooR: Pourquoi mon vecteur est-il en désordre?

mine <- zoo(c(rep(0,4),rep(1,4),rep(0,5),rep(1,23),rep(0,4),rep(1,2)),as.chron(seq(1:42))) 

Et je veux extraire plusieurs éléments dans un ordre

> mine[14] 
01/15/70 
     1 
> mine[5] 
01/06/70 
     1 
> mine[41] 
02/11/70 
     1 

Il fonctionne !. Mais maintenant, j'essayer de le faire d'une manière différente

zz <- c(14, 5, 41) 
mine[zz] 

01/06/70 01/15/70 02/11/70 
     1  1  1 

Je ne sais pas pourquoi je l'obtenir dans un ordre différent. Comment puis-je garder l'ordre que je veux, l'ordre de ma liste ?? Cela ne me dérange pas si c'est une liste, un vecteur, par colonnes ou par ligne, mais j'aimerais l'obtenir dans l'ordre que j'ai demandé.

acclamations

+2

Quelle est la langue? –

+0

Veuillez essayer de fournir un code reproductible, cet exemple nécessite le paquet zoo et le paquet chron dans R, de version non spécifiée dans un environnement non spécifié – mdsumner

+0

Utilisez l'argument 'rep'' each' pour éviter les appels repetés, par exemple 'rep (rep.int (0: 1, 3), chacun = c (4, 4, 5, 23, 4, 2)) '. –

Répondre

4

La réponse à pourquoi zoo le fait est qu'il a une méthode pour la fonction [ ([.zoo), et il crée un nouvel objet zoo à partir des valeurs subsetted, qu'il veut logiquement modifier l'ordre de telle sorte que c'est un objet de zoo valide.

Vous pouvez obtenir ce que vous voulez en accédant aux indices de temps et des données via les fonctions accesseurs pertinentes:

> index(mine)[c(14, 5, 41)] 
[1] 01/15/70 01/06/70 02/11/70 
> coredata(mine)[c(14, 5, 41)] 
[1] 1 1 1 

Si vous voulez combiner en une seule étape, écrivez votre propre plaisir à faire:

myExtract <- function(x, want) { 
    out <- coredata(mine)[want] 
    names(out) <- index(x)[want] 
    out 
} 

Ce qui donne:

> myExtract(mine, want = c(14, 5, 41)) 
01/15/70 01/06/70 02/11/70 
     1  1  1 
+0

Merci beaucoup. Des choses simples (mais importantes) comme celles-ci font échouer un code – skan