2009-10-14 14 views

Odpowiedz

59

Oto jeden liner ...

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

[edit:] złamie ten przedstawia się następująco:

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 
+0

To jest bardzo zwięzłe, ale ciężko jest zorientować się, co się tam dzieje. Czy mógłbyś trochę rozwinąć? –

+0

Dzięki! order() wprawiał mnie w zakłopotanie - wydawał się po prostu przestawiać liczby arbitralnie, ale to był tylko artefakt o sekwencji 1-4. –

+2

To jest ładne i pokazuje dobre zrozumienie wbudowanych R. +1 – Godeke

-3

pętli nad y i przenieść wszystkie dopasowane wartości X do właściwej lokalizacji.

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

wynik w Z: 4 4 4 2 2 1 3 3 3

istotne etapy:

  1. do (I, Y) - Pętle nad elementami interesujących .

  2. oo < - c (z, ...) - Łączy każdy podwyrażenie z kolei

  3. rep (I, suma (x == i)) - Powtórzenia I (prąd elementem zainteresowania) suma (x == i) razy (liczba razy, kiedy znaleźliśmy i wx).

3

Można konwertować x w uporządkowany czynnik:

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

Oczywiście, zmieniając swoje numery na czynniki mogą radykalnie zmienić kod dalszy sposób reaguje na x. Ale ponieważ nie dałeś nam żadnego kontekstu na temat tego, co dzieje się dalej, pomyślałem, że proponuję to jako opcję.

+0

to powinna być najlepsza odpowiedź, ponieważ będzie działać dla przypadków innych niż całkowite; lub działa również wtedy, gdy wartości 'x' nie znajdują się w wektorze sortującym' y' z niewielką zmianą: 'x <- c (2, 2, 3, 4, 1, 4, 4, 3, 3, 6); y <- c (4, 2, 1, 3); as.numeric (jako .character (sort (czynnik (x, unikalny (c (y, x)))))) ' – rawr

1

[ Edit. Wyraźnie Ian ma właściwe podejście, ale zostawię to w potomności]

Można to zrobić bez pętli przez indeksowania na wektor y. Dodaj wzrastających wartości numerycznej y i scalić je:

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 
2

Co powiesz na?:

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

(Ian jest prawdopodobnie jeszcze lepiej)

111

co o tym jednym

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

To jest bardzo ładne, lepsze niż zaakceptowana odpowiedź IMHO, ponieważ jest bardziej ogólna. – fmark

+2

Posunąłbym się nawet do stwierdzenia, że ​​powinno to być w bazie GNU-R. –

+0

To naprawdę zabawne, jak często natrafiam na tę sytuację i kończę powtarzanie tej jednej linii odpowiedzi. Chodzi o to, jak SO może być pomocne w najmniej skomplikowanych sprawach haha –

0

w przypadku trzeba uzyskać zamówienie na "y" nie ma znaczenia, czy to cyfry lub znaki:

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

Przez krokach:

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 
Powiązane problemy