two tables sort ordenar multiple función data columns column according sorting r

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



sort order r (8)

¿Qué tal si?:

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

(Ian es probablemente aún mejor)

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


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


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 reacciona 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.


[ 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


bucle sobre y y mueva todo el valor coincidente en X para corregir la ubicación.


que tal este

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


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, suma (x == i)) - Repite i (el elemento actual de interés) sum (x == i) veces (el número de veces que encontramos i en x).