R menawarkan max dan min, tetapi saya tidak melihat cara yang sangat cepat untuk menemukan nilai lain dalam urutan, selain memilah seluruh vektor dan kemudian memilih nilai x dari vektor ini.
Apakah ada cara yang lebih cepat untuk mendapatkan nilai tertinggi kedua, misalnya?
topn
fungsi yang lebih cepat daripadasort
,order
dannth
. Lihatlah dokumentasinya.Jawaban:
Rfast memiliki fungsi yang disebut nth_element yang melakukan persis apa yang Anda minta dan lebih cepat dari semua implementasi yang dibahas di atas
Juga metode yang dibahas di atas yang didasarkan pada semacam parsial, tidak mendukung menemukan k terkecil nilai-nilai
Akan mengembalikan elemen x ke 5 terbesar, sementara
Akan mengembalikan elemen terkecil ke-5 x
Tingkatan yang dicapai di bawah ini terhadap sebagian besar jawaban populer.
Untuk 10 ribu angka:
Untuk 1 juta angka:
sumber
Rfast::nth
dapat mengembalikan beberapa elemen (misalnya elemen terbesar ke-8 dan ke-9) serta indeks elemen-elemen tersebut.Gunakan
partial
argumen darisort()
. Untuk nilai tertinggi kedua:sumber
sort(x, TRUE)[2]
dijelaskan dalam jawaban @ Abrar, selain tidak memuaskan kendala dalam pertanyaan?Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) : index 4705 outside bounds
Ada yang tahu apa masalahnya? Beberapa perincian: X saya adalah vektor numerik dengan panjang 4706 dengan beberapaNA
s dalam data. Saya mencoba untuk mendapatkan nilai tertinggi kedua dalam vektor menggunakan kode yang sama persis seperti yang disarankan oleh @RobHyndman.decreasing
argumennya tidak kompatibel dengan penyortiran parsial, Anda selalu bisa-sort(-x, partial=n-1)[n-1]
; ini secara logis adalah hal yang sama dan membutuhkan waktu yang jauh lebih sedikit daripadasort(x, decreasing=TRUE)[n-1]
.Alternatif sedikit lebih lambat, hanya untuk catatan:
sumber
max(x[-which.max(x)])
Saya membungkus jawaban Rob menjadi fungsi yang sedikit lebih umum, yang dapat digunakan untuk menemukan maks 2, 3, 4 (dll):
sumber
maxN(1:10, 1:3)
(saya akan mengatur default N ke 1)Berikut adalah cara mudah untuk menemukan indeks N nilai terkecil / terbesar dalam vektor (Contoh untuk N = 3):
N Terkecil:
N Terbesar:
Jadi, Anda dapat mengekstrak nilai sebagai:
sumber
Untuk nilai tertinggi ke-n,
sumber
Saya menemukan bahwa menghapus elemen max terlebih dahulu dan kemudian menjalankan max lainnya dalam kecepatan yang sebanding:
sumber
Inilah cara paling sederhana yang saya temukan,
sumber
Ketika saya baru-baru ini mencari R fungsi mengembalikan indeks atas N max / angka min dalam vektor yang diberikan, saya terkejut tidak ada fungsi seperti itu.
Dan ini adalah sesuatu yang sangat mirip.
Solusi brute force menggunakan fungsi dasar :: order tampaknya yang paling mudah.
Tetapi ini bukan yang tercepat jika nilai N Anda relatif kecil dibandingkan dengan panjang vektor x .
Di sisi lain jika N benar-benar kecil, Anda dapat menggunakan basis :: whichMax berfungsi secara iteratif dan di setiap iterasi Anda dapat mengganti nilai yang ditemukan dengan -Inf
Saya percaya Anda melihat masalah - sifat copy-on-memodifikasi R. Jadi ini akan bekerja lebih baik untuk N sangat sangat sangat kecil (1,2,3) tetapi akan cepat melambat untuk nilai N yang lebih besar. Dan Anda mengulangi semua elemen dalam vektor x N kali.
Saya pikir solusi terbaik dalam clean R adalah dengan menggunakan basis parsial :: sort .
Kemudian Anda dapat memilih yang terakhir ( N th) item dari hasil fungsi defiend di atas.
Catatan: fungsi yang didefinisikan di atas hanyalah contoh - jika Anda ingin menggunakannya, Anda harus memeriksa / input sanity (mis. N> panjang (x) ).
Saya menulis sebuah artikel kecil tentang sesuatu yang sangat mirip (dapatkan indeks nilai maksimal N / min maksimum vektor) di http://palusga.cz/?p=18 - Anda dapat menemukan di sini beberapa tolok ukur fungsi serupa yang saya tetapkan di atas.
sumber
head(sort(x),..)
atautail(sort(x),...)
harus bekerjasumber
fungsi ini akan mengembalikan matriks dengan nilai n atas dan indeksnya. harap ini membantu VDevi-Chou
sumber
Ini akan menemukan indeks dari N'th nilai terkecil atau terbesar di input numerik vektor x. Setel bawah = BENAR dalam argumen jika Anda ingin N'th dari bawah, atau bawah = FALSE jika Anda ingin N'th dari atas. N = 1 dan bawah = BENAR setara dengan which.min, N = 1 dan bawah = FALSE setara dengan yang.max.
sumber
dplyr memiliki fungsi n, di mana argumen pertama adalah vektor dan yang kedua adalah tempat yang Anda inginkan. Ini berlaku untuk elemen berulang juga. Sebagai contoh:
Menemukan nilai terbesar kedua:
sumber
x[[order(order_by)[[n]]]]
- jadi ini membutuhkan pengurutan seluruh vektor. Jadi itu tidak akan secepat jawaban yang diterima.sort
dengan argumen parsial = (yang mengubah segalanya)dplyr::nth()
?bench::mark(max(x[-which.max(x)]), x[[order(-x)[[2]]]] )
,nth()
sepertinya hampir 10 kali lebih lambat, di manalength(x)
3 juta.Anda dapat mengidentifikasi nilai yang lebih tinggi berikutnya dengan
cummax()
. Jika Anda ingin lokasi masing-masing nilai baru yang lebih tinggi misalnya, Anda dapat meneruskan vektorcummax()
nilai Anda kediff()
fungsi untuk mengidentifikasi lokasi di manacummax()
nilai berubah. katakanlah kita memiliki vektorSekarang, jika Anda ingin menemukan lokasi perubahan,
cummax()
Anda memiliki banyak opsi yang cenderung saya gunakansign(diff(cummax(v)))
. Anda harus menyesuaikan elemen pertama yang hilang karenadiff()
. Kode lengkap untuk vektorv
adalah:sumber
Anda dapat menggunakan
sort
kata kunci seperti ini:Contoh:
akan memberikan 5 angka maks pertama.
sumber