Risposte:
Ecco un one liner ...
y[sort(order(y)[x])]
[modifica:] Questo si suddivide come segue:
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
xe y. x <- c(1,4,2); y <- c(1,2,4)per esempio.
che dire di questo
x[order(match(x,y))]
Potresti convertire xin un fattore ordinato:
x.factor <- factor(x, levels = y, ordered=TRUE)
sort(x)
sort(x.factor)
Ovviamente, cambiare i tuoi numeri in fattori può cambiare radicalmente il modo in cui reagisce il codice a valle x. Ma dal momento che non ci hai fornito alcun contesto su ciò che accade dopo, ho pensato di suggerirlo come opzione.
xnon nel vettore di ordinamento ycon lievi modifiche: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))))))
Che ne dite di?:
rep(y,table(x)[as.character(y)])
(Quello di Ian è probabilmente ancora migliore)
Nel caso in cui sia necessario ottenere l'ordine su "y", non importa se si tratta di numeri o caratteri:
x[order(ordered(x, levels = y))]
4 4 4 2 2 1 3 3 3
A passi:
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
[ Modifica: chiaramente Ian ha l'approccio giusto, ma lo lascerò ai posteri.]
Puoi farlo senza loop indicizzando il tuo vettore y. Aggiungi un valore numerico incrementale a y e uniscili:
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))) }
Il risultato in z: 4 4 4 2 2 1 3 3 3
I passaggi importanti:
for (i in y) - Ripete gli elementi di interesse.
z <- c (z, ...) - Concatena a turno ciascuna sottoespressione
rep (i, sum (x == i)) - Ripete i (l'elemento di interesse corrente) sum (x == i) volte (il numero di volte che abbiamo trovato i in x).
Inoltre puoi usarlo sqldfe farlo da una joinfunzione sqlcome la seguente:
library(sqldf)
x <- data.frame(x = c(2, 2, 3, 4, 1, 4, 4, 3, 3))
y <- data.frame(y = c(4, 2, 1, 3))
result <- sqldf("SELECT x.x FROM y JOIN x on y.y = x.x")
ordered_x <- result[[1]]