J'ai un vecteur x, que je voudrais trier en fonction de l'ordre des valeurs dans le vecteur y. Les deux vecteurs ne sont pas de la même longueur.
x <- c(2, 2, 3, 4, 1, 4, 4, 3, 3)
y <- c(4, 2, 1, 3)
Le résultat attendu serait:
[1] 4 4 4 2 2 1 3 3 3
x
ety
.x <- c(1,4,2); y <- c(1,2,4)
par exemple.et celui-là
la source
Vous pouvez convertir
x
en un facteur ordonné:É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.la source
x
pas dans le vecteur de triy
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(factor(x, unique(c(y, x))))))
Que diriez-vous?:
(Ian est probablement encore meilleur)
la source
Au cas où vous auriez besoin de commander sur "y", qu'il s'agisse de chiffres ou de caractères:
Par étapes:
la source
[ 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:
la source
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).
la source
Vous pouvez également l'utiliser
sqldf
et le faire par unejoin
fonctionsql
comme suit:la source