Jawaban:
Ini satu kapal ...
y[sort(order(y)[x])]
[edit:] Ini memecah sebagai berikut:
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
xdan y. x <- c(1,4,2); y <- c(1,2,4)misalnya.
bagaimana dengan yang satu ini
x[order(match(x,y))]
Anda dapat mengubahnya xmenjadi faktor yang dipesan:
x.factor <- factor(x, levels = y, ordered=TRUE)
sort(x)
sort(x.factor)
Jelas, mengubah angka Anda menjadi faktor dapat secara radikal mengubah cara kode downstream bereaksi x. Tetapi karena Anda tidak memberi kami konteks apa pun tentang apa yang terjadi selanjutnya, saya pikir saya akan menyarankan ini sebagai opsi.
xtidak dalam vektor pengurutan ydengan sedikit perubahan: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))))))
Bagaimana tentang?:
rep(y,table(x)[as.character(y)])
(Ian mungkin masih lebih baik)
Jika Anda perlu mendapatkan urutan pada "y" tidak peduli apakah itu angka atau karakter:
x[order(ordered(x, levels = y))]
4 4 4 2 2 1 3 3 3
Dengan langkah-langkah:
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
[ Sunting: Jelas Ian memiliki pendekatan yang benar, tapi saya akan membiarkan ini untuk anak cucu.]
Anda dapat melakukan ini tanpa loop dengan mengindeks vektor y Anda. Tambahkan nilai numerik yang bertambah ke y dan gabungkan:
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))) }
Hasil di z: 4 4 4 2 2 1 3 3 3
Langkah-langkah penting:
for (i in y) - Loop di atas elemen yang diminati.
z <- c (z, ...) - Menggabungkan setiap subekspresi secara bergantian
rep (i, sum (x == i)) - Mengulangi i (elemen minat saat ini) jumlah (x == i) kali (berapa kali kami menemukan i dalam x).