Réponses:
Voici un one-liner ...
y[sort(order(y)[x])]
[modifier:] Cela 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
xet y. x <- c(1,4,2); y <- c(1,2,4)par exemple.
et celui-là
x[order(match(x,y))]
Vous pouvez convertir xen un facteur ordonné:
x.factor <- factor(x, levels = y, ordered=TRUE)
sort(x)
sort(x.factor)
Évidemment, changer vos nombres en facteurs peut changer radicalement la façon dont le code 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.
xpas dans le vecteur de tri yavec 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(factor(x, unique(c(y, x))))))
Que diriez-vous?:
rep(y,table(x)[as.character(y)])
(Ian est probablement encore meilleur)
Au cas où vous auriez besoin de commander sur "y", qu'il s'agisse de chiffres 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
[ Edit: Clairement Ian a la bonne approche, mais je laisserai cela pour la postérité.]
Vous pouvez le faire sans boucles en indexant sur votre vecteur y. Ajoutez une valeur numérique incrémentielle à y et fusionnez-les:
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
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:
for (i in y) - Boucle sur les éléments d'intérêt.
z <- c (z, ...) - Concatène chaque sous-expression tour à tour
rep (i, sum (x == i)) - Répète i (l'élément actuel d'intérêt) sum (x == i) fois (le nombre de fois où nous avons trouvé i dans x).