Bagaimana cara memeriksa apakah vektor berisi nilai yang diberikan?
%
tanda-tanda yang ada. Kata itu in
adalah 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 in
adalah 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.elements
bekerja 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 fruit
masuk akal, fruit in apple
tidak. is.element(apple, fruit)
atau is.element(fruit, apple)
keduanya bisa benar tergantung pada implementasi is.element
fungsi.
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% NA
pengembalian 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))]
which
sebenarnya 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/...
which
jika Anda hanya ingin menemukan elemen yang tidak ada Tset
? Anda bisa pop
langsung 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.
grep
ekspresi reguler sebagai elemen pertama, jadi untuk melakukan pencocokan yang tepat untuk "b"
, gunakan ^e$
atau tambahkan , fixed=TRUE
).