Uji apakah vektor berisi elemen yang diberikan


518

Bagaimana cara memeriksa apakah vektor berisi nilai yang diberikan?


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

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

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


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

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

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))]

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.


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.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.