Bagaimana cara memeriksa apakah vektor berisi nilai yang diberikan?
%tanda-tanda yang ada. Kata itu inadalah kata khusus dalam R yang digunakan dalam konstruksi for-loop.
select(iris, contains("etal")).
Bagaimana cara memeriksa apakah vektor berisi nilai yang diberikan?
%tanda-tanda yang ada. Kata itu inadalah kata khusus dalam R yang digunakan dalam konstruksi for-loop.
select(iris, contains("etal")).
Jawaban:
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
which(v, 'b'). Pikirkan urutan argumennya.
which(v, 'b')memberi saya pesan kesalahan:> Kesalahan di mana (v, 'b'): argumen ke 'yang' tidak logis
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
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
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.
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
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
%in%: any(1==NA)pengembalian NA, di mana 1 %in% NApengembalian FALSE.
any(1==NA, na.rm=TRUE)kembali FALSE.
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/...
whichjika Anda hanya ingin menemukan elemen yang tidak ada Tset? Anda bisa poplangsung mengindeks ; pop[!pop%in%Tset]
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.
grepekspresi reguler sebagai elemen pertama, jadi untuk melakukan pencocokan yang tepat untuk "b", gunakan ^e$atau tambahkan , fixed=TRUE).