¿Cómo ordeno un vector según los valores de otro

Tengo un vector x, que me gustaría ordenar en función del orden de los valores en el vector y. Los dos vectores no son de la misma longitud.

x <- c(2, 2, 3, 4, 1, 4, 4, 3, 3) y <- c(4, 2, 1, 3) 

El resultado esperado sería:

 [1] 4 4 4 2 2 1 3 3 3 

Aquí hay un trazador de líneas …

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

[edit:] Esto se divide de la siguiente manera:

 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 

que tal este

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

Puedes convertir x en un factor ordenado:

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

Obviamente, cambiar sus números en factores puede cambiar radicalmente la forma en que el código aguas abajo reactjs a x . Pero como no nos dio ningún contexto sobre lo que sucederá a continuación, pensé que lo recomendaría como una opción.

¿Qué tal si?:

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

(Ian es probablemente aún mejor)

[ Editar: Claramente Ian tiene el enfoque correcto, pero dejaré esto para la posteridad.]

Puede hacer esto sin bucles indexando en su vector y. Agregue un valor numérico creciente a y unirlos:

 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))) } 

El resultado en z: 4 4 4 2 2 1 3 3 3

Los pasos importantes:

  1. para (i en y) - Bucles sobre los elementos de interés.

  2. z <- c (z, ...) - Concatena cada subexpresión a su vez

  3. rep (i, sum (x == i)) - Repite i (el elemento actual de interés) sum (x == i) veces (el número de veces que encontramos i en x).

En caso de que necesite hacer un pedido en “y” sin importar si se trata de números o caracteres:

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

Por pasos:

 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