Dalam R, saya memiliki elemen x
dan vektor v
. Saya ingin mencari indeks pertama dari suatu elemen v
yang sama dengan x
. Saya tahu bahwa salah satu cara untuk melakukan ini adalah:, which(x == v)[[1]]
tetapi tampaknya terlalu tidak efisien. Apakah ada cara yang lebih langsung untuk melakukannya?
Untuk poin bonus, apakah ada fungsi yang berfungsi jika x
vektor? Artinya, harus mengembalikan vektor indeks yang menunjukkan posisi setiap elemen x
dalam v
.
r
indexing
match
vectorization
Ryan C. Thompson
sumber
sumber
which(x == v)[[1]]
tidak begitu tidak efisien. Ini satu perbandingan (==
) operator yang diterapkan untuk semua elemen vektor dan satu subset pada indeks (which
). Itu dia. Tidak ada yang seharusnya relevan, selama Anda tidak menjalankan 10.000 pengulangan pada fungsi ini. Solusi lain sukamatch
danPosition
mungkin tidak mengembalikan sebanyak mungkin datawhich
, tetapi tidak selalu lebih efisien.which(x == v)[[1]]
tidak.Jawaban:
Fungsi ini
match
bekerja pada vektor:match
hanya mengembalikan pertemuan pertama pertandingan, seperti yang Anda minta. Ini mengembalikan posisi dalam argumen kedua dari nilai-nilai dalam argumen pertama.Untuk pencocokan berganda,
%in%
adalah caranya:%in%
mengembalikan vektor logis selama argumen pertama, dengan nilaiTRUE
jika itu dapat ditemukan dalam argumen kedua danFALSE
sebaliknya.sumber
match
masalah jika Anda menginginkan indeks kejadian pertama. Sebagai contoh Anda,match(x,c(4,8))
berikan hasil yang berbeda, yang pada awalnya tidak terlalu jelas.match
. Semuanya dijelaskan di sana. Tetapi saya menambahkan informasi itu.fungsi
Position
di funprog {base} juga berfungsi . Ini memungkinkan Anda untuk melewati fungsi arbitrer, dan mengembalikan kecocokan pertama atau terakhir.Position(f, x, right = FALSE, nomatch = NA_integer)
sumber
Catatan kecil tentang efisiensi metode yang disebutkan di atas:
Jadi, yang terbaik adalah
sumber
which("Feb" == month.abb)
mengembalikan2
–mengapa[[1]]
?which(x == v)[[1]]
, . Tapi itu tampaknya terlalu tidak efisien"R telah membebani
==
operator ganda sama dengan metode menemukan indeks jarum di tumpukan jerami vektor. Ini menghasilkanlogical
vektor, berisiTRUE
nilai untuk setiap pertandingan di tumpukan jerami.Contoh:
Ini berfungsi jika keduanya vektor, dan dapat diperluas untuk menggunakan beberapa vektor juga.
sumber
==
Operator sudah disebutkan dalam pertanyaan saya sebagai solusi efisien yang tidak bekerja dengan vektor jarum.FALSE FALSE TRUE FALSE TRUE
alih-alih indeks dalam contoh ini==
mengembalikan vektor logis, bukan indeks. Untuk itu Anda perluwhich()
, seperti yang saya jelaskan 7 tahun lalu.