2009-10-14 7 views

Répondre

59

Voici une doublure ...

y[sort(order(y)[x])] 

[edit:] Ce se décompose comme suit:

order(y)    #We want to sort by y, so order() gives us the sorting order 
order(y)[x]   #looks up the sorting order for each x 
sort(order(y)[x]) #sorts by that order 
y[sort(order(y)[x])] #converts orders back to numbers from orders 
+0

C'est très succinct, mais j'ai du mal à comprendre ce qui se passe là-bas. Pourriez-vous élaborer un peu? –

+0

Merci! order() me déroutait - semblait réarranger arbitrairement les nombres, mais c'était juste un artefact d'avoir une séquence de 1-4. –

+2

C'est joli et montre une bonne compréhension des built-ins de R. +1 – Godeke

-3
boucle

sur y et déplacer toute valeur adaptée en X à l'emplacement correct.

0
x <- c(2, 2, 3, 4, 1, 4, 4, 3, 3) 
y <- c(4, 2, 1, 3) 
for(i in y) { z <- c(z, rep(i, sum(x==i))) } 

Le résultat en z: 4 4 4 2 2 1 3 3 3

Les étapes importantes:

  1. for (i in y) - Les boucles sur les éléments d'intérêt .

  2. z < - c (z, ...) - concatène chaque sous-expression à son tour

  3. rep

    (i, la somme (x == i)) - Repeats i (l'élément courant d'intérêt) sum (x == i) fois (le nombre de fois où nous avons trouvé i dans x).

3

Vous pouvez convertir en un facteur x ordonné:

x.factor <- factor(x, levels = y, ordered=TRUE) 
sort(x) 
sort(x.factor) 

Il est évident que, en changeant vos nombres en facteurs peuvent radicalement changer le code de la route en aval réagit à x. Mais puisque vous ne nous avez pas donné de contexte sur ce qui se passe ensuite, j'ai pensé que je suggérerais cela comme une option.

+0

cela devrait être la meilleure réponse car cela fonctionnerait pour les cas non entiers; ou aussi travailler quand il y a des valeurs dans 'x' pas dans le vecteur de tri' y' avec un léger changement: 'x <- c (2, 2, 3, 4, 1, 4, 4, 3, 3, 6); y <- c (4, 2, 1, 3); as.numeric (as.character (sort (facteur (x, unique (c (y, x))))) ' – rawr

1

[ Edit:. Il est clair que Ian a la bonne approche, mais je vais laisser cela à la postérité]

Vous pouvez le faire sans boucles par l'indexation sur votre vecteur y. Ajouter une valeur numérique à y incrémenter et les fusionner:

y <- data.frame(index=1:length(y), x=y) 
x <- data.frame(x=x) 
x <- merge(x,y) 
x <- x[order(x$index),"x"] 
x 
[1] 4 4 4 2 2 1 3 3 3 
2

Que diriez-vous?:

rep(y,table(x)[as.character(y)]) 

(de Ian est probablement encore mieux)

111

Qu'en est celui

x[order(match(x,y))] 
+18

Ceci est très agréable, mieux que la réponse acceptée à mon humble avis car il est plus général. – fmark

+2

J'irais même jusqu'à dire que cela devrait être dans la base GNU-R. –

+0

C'est vraiment drôle combien de fois je suis confronté à cette situation et à la fin de cette réponse en ligne. Va montrer comment SO peut être utile sur les choses les moins complexes haha –

0

Si vous avez besoin de mettre en ordre sur « y » peu importe si le nombre de elle ou de caractères:

x[order(ordered(x, levels = y))] 
4 4 4 2 2 1 3 3 3 

par étapes:

a <- ordered(x, levels = y) # Create ordered factor from "x" upon order in "y". 
[1] 2 2 3 4 1 4 4 3 3 
Levels: 4 < 2 < 1 < 3 

b <- order(a) # Define "x" order that match to order in "y". 
[1] 4 6 7 1 2 5 3 8 9 

x[b] # Reorder "x" according to order in "y". 
[1] 4 4 4 2 2 1 3 3 3 
Questions connexes