Saya memiliki vektor x, yang ingin saya sortir berdasarkan urutan nilai dalam vektor y. Kedua vektor tidak memiliki panjang yang sama.
x <- c(2, 2, 3, 4, 1, 4, 4, 3, 3)
y <- c(4, 2, 1, 3)
Hasil yang diharapkan adalah:
[1] 4 4 4 2 2 1 3 3 3
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
x
dany
.x <- c(1,4,2); y <- c(1,2,4)
misalnya.bagaimana dengan yang satu ini
sumber
Anda dapat mengubahnya
x
menjadi faktor yang dipesan: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.sumber
x
tidak dalam vektor pengurutany
dengan 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?:
(Ian mungkin masih lebih baik)
sumber
Jika Anda perlu mendapatkan urutan pada "y" tidak peduli apakah itu angka atau karakter:
Dengan langkah-langkah:
sumber
[ 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:
sumber
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).
sumber
Anda juga dapat menggunakan
sqldf
dan melakukannya denganjoin
fungsisql
seperti berikut:sumber