Uji apakah vektor berisi elemen yang diberikan

518

Bagaimana cara memeriksa apakah vektor berisi nilai yang diberikan?

medriscoll
sumber
38
kadang-kadang saya bertanya pada diri sendiri mengapa R tidak menggunakan kata berisi untuk memudahkan pengguna
greg121
12
pertimbangkan bahwa "dalam" terkandung dalam "conta (in) s"; Saya berpendapat bahwa "dalam" adalah pesaing yang sangat singkat dalam konteks ini
hedgedandlevered
1
Mungkin dengan penambahan %tanda-tanda yang ada. Kata itu inadalah kata khusus dalam R yang digunakan dalam konstruksi for-loop.
IRTFM
@ greg121 dplyr sudah memiliki fungsi berisi , tetapi digunakan untuk tujuan yang berbeda: untuk memilih kolom dalam bingkai data. Sebagai contoh select(iris, contains("etal")).
Paul Rougieux
Apakah ada cara ringkas untuk melakukannya untuk bilangan bernilai nyata dengan presisi yang diberikan?
mlt

Jawaban:

500

Kedua match()(kembali penampilan pertama) dan %in%(kembali Boolean) fungsi dirancang untuk ini.

v <- c('a','b','c','e')

'b' %in% v
## returns TRUE

match('b',v)
## returns the first location of 'b', in this case: 2
medriscoll
sumber
bagaimana dengan mendapatkan semua penampilan, bukan hanya yang pertama?
StatsSorceress
Mungkin saya datang agak terlambat. which(v, 'b'). Pikirkan urutan argumennya.
Niklas Mertsch
Anda which(v, 'b')memberi saya pesan kesalahan:> Kesalahan di mana (v, 'b'): argumen ke 'yang' tidak logis
Capt.Krusty
176

is.element() membuat kode lebih mudah dibaca, dan identik dengan %in%

v <- c('a','b','c','e')

is.element('b', v)
'b' %in% v
## both return TRUE

is.element('f', v)
'f' %in% v
## both return FALSE

subv <- c('a', 'f')
subv %in% v
## returns a vector TRUE FALSE
is.element(subv, v)
## returns a vector TRUE FALSE
Justin Nafe
sumber
6
Saya tahu kata dokumentasi itu is.element(x, y) is identical to x %in% y. Tapi, saya tidak tahu mengapa, is.elementsbekerja ketika mencampur bilangan bulat dan angka dan %in%tidak
pomber
@pomber: Bisakah Anda memberikan contohnya?
Disiplin
@ pelanggan apakah sudah diperbaiki?
vasili111
2
Keterbacaan superior is.element()vs %in%subyektif. Sebuah kasus dapat dibuat bahwa operator infiks lebih mudah dibaca karena menghilangkan ambiguitas dalam urutan argumen. apple in fruitmasuk akal, fruit in appletidak. is.element(apple, fruit)atau is.element(fruit, apple)keduanya bisa benar tergantung pada implementasi is.elementfungsi.
rileymcdowell
70

Saya akan mengelompokkan opsi berdasarkan output. Asumsikan vektor berikut untuk semua contoh.

v <- c('z', 'a','b','a','e')

Untuk memeriksa keberadaan:

%di%

> 'a' %in% v
[1] TRUE

apa saja()

> any('a'==v)
[1] TRUE

is.element ()

> is.element('a', v)
[1] TRUE

Untuk menemukan kejadian pertama:

pertandingan()

> match('a', v)
[1] 2

Untuk menemukan semua kejadian sebagai vektor indeks:

yang()

> which('a' == v)
[1] 2 4

Untuk menemukan semua kejadian sebagai vektor logis :

==

> 'a' == v
[1] FALSE  TRUE FALSE  TRUE FALSE

Sunting: Menghapus grep () dan grepl () dari daftar karena alasan yang disebutkan dalam komentar

ishandutta2007
sumber
6
Seperti yang sudah dikomentari di sini dan di sini , jangan gunakan grep()atau ekspresi reguler untuk menemukan kecocokan yang tepat.
Uwe
69

Fungsi any () membuat kode dapat dibaca

> w <- c(1,2,3)
> any(w==1)
[1] TRUE

> v <- c('a','b','c')
> any(v=='b')
[1] TRUE

> any(v=='f')
[1] FALSE
Dan Goldstein
sumber
9
Sadarilah ini berperilaku berbeda dari %in%: any(1==NA)pengembalian NA, di mana 1 %in% NApengembalian FALSE.
@ user3603486: any(1==NA, na.rm=TRUE)kembali FALSE.
AkselA
36

Anda dapat menggunakan %in%operator:

vec <- c(1, 2, 3, 4, 5)
1 %in% vec # true
10 %in% vec # false
ars
sumber
19

Juga untuk menemukan posisi elemen "yang" dapat digunakan sebagai

pop <- c(3,4,5,7,13)

which(pop==13)

dan untuk menemukan elemen-elemen yang tidak terkandung dalam vektor target, orang dapat melakukan ini:

pop <- c(1,2,4,6,10)

Tset <- c(2,10,7)   # Target set

pop[which(!(pop%in%Tset))]
Armin
sumber
whichsebenarnya lebih disukai kadang-kadang karena memberi Anda semua posisi yang cocok (sebagai array), tidak seperti match. Meskipun ini mungkin bukan apa yang diminta OP, tidak seperti stackoverflow.com/questions/1169388/...
Fizz
2
Mengapa repot-repot dengan whichjika Anda hanya ingin menemukan elemen yang tidak ada Tset? Anda bisa poplangsung mengindeks ; pop[!pop%in%Tset]
Pengurus rumah tangga
13

Saya sangat suka grep () dan grepl () untuk tujuan ini.

grep () mengembalikan vektor bilangan bulat, yang menunjukkan tempat yang cocok.

yo <- c("a", "a", "b", "b", "c", "c")

grep("b", yo)
[1] 3 4

grepl () mengembalikan vektor logis, dengan "BENAR" di lokasi yang cocok.

yo <- c("a", "a", "b", "b", "c", "c")

grepl("b", yo)
[1] FALSE FALSE  TRUE  TRUE FALSE FALSE

Fungsi-fungsi ini peka terhadap huruf besar-kecil.

ojdajuiceman
sumber
10
Secara default, gunakan grepekspresi reguler sebagai elemen pertama, jadi untuk melakukan pencocokan yang tepat untuk "b", gunakan ^e$atau tambahkan , fixed=TRUE).
reinierpost
10
Jangan gunakan regex untuk pencocokan tepat. Ini berbahaya dan dapat memiliki hasil yang tidak terduga
David Arenburg
9
Ya, ini adalah ide yang buruk, tidak baik, sangat buruk - tidak efisien dan dijamin akan rusak. Misalnya myvar <- 'blah'; grepl('b', myvar, fixed=TRUE)akan kembali TRUEwalaupun 'b' tidak ada myvar.