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
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]24
Untuk menemukan semua kejadian sebagai vektor logis :
==
>'a'== v
[1]FALSETRUEFALSETRUEFALSE
Sunting: Menghapus grep () dan grepl () dari daftar karena alasan yang disebutkan dalam komentar
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]34
grepl () mengembalikan vektor logis, dengan "BENAR" di lokasi yang cocok.
yo <- c("a","a","b","b","c","c")
grepl("b", yo)[1]FALSEFALSETRUETRUEFALSEFALSE
Fungsi-fungsi ini peka terhadap huruf besar-kecil.
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.
%
tanda-tanda yang ada. Kata ituin
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.sumber
which(v, 'b')
. Pikirkan urutan argumennya.which(v, 'b')
memberi saya pesan kesalahan:> Kesalahan di mana (v, 'b'): argumen ke 'yang' tidak logisis.element()
membuat kode lebih mudah dibaca, dan identik dengan%in%
sumber
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%
tidakis.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)
atauis.element(fruit, apple)
keduanya bisa benar tergantung pada implementasiis.element
fungsi.Saya akan mengelompokkan opsi berdasarkan output. Asumsikan vektor berikut untuk semua contoh.
Untuk memeriksa keberadaan:
%di%
apa saja()
is.element ()
Untuk menemukan kejadian pertama:
pertandingan()
Untuk menemukan semua kejadian sebagai vektor indeks:
yang()
Untuk menemukan semua kejadian sebagai vektor logis :
==
Sunting: Menghapus grep () dan grepl () dari daftar karena alasan yang disebutkan dalam komentar
sumber
grep()
atau ekspresi reguler untuk menemukan kecocokan yang tepat.Fungsi any () membuat kode dapat dibaca
sumber
%in%
:any(1==NA)
pengembalianNA
, di mana1 %in% NA
pengembalianFALSE
.any(1==NA, na.rm=TRUE)
kembaliFALSE
.Anda dapat menggunakan
%in%
operator:sumber
Juga untuk menemukan posisi elemen "yang" dapat digunakan sebagai
dan untuk menemukan elemen-elemen yang tidak terkandung dalam vektor target, orang dapat melakukan ini:
sumber
which
sebenarnya lebih disukai kadang-kadang karena memberi Anda semua posisi yang cocok (sebagai array), tidak sepertimatch
. Meskipun ini mungkin bukan apa yang diminta OP, tidak seperti stackoverflow.com/questions/1169388/...which
jika Anda hanya ingin menemukan elemen yang tidak adaTset
? Anda bisapop
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.
grepl () mengembalikan vektor logis, dengan "BENAR" di lokasi yang cocok.
Fungsi-fungsi ini peka terhadap huruf besar-kecil.
sumber
grep
ekspresi reguler sebagai elemen pertama, jadi untuk melakukan pencocokan yang tepat untuk"b"
, gunakan^e$
atau tambahkan, fixed=TRUE
).myvar <- 'blah'; grepl('b', myvar, fixed=TRUE)
akan kembaliTRUE
walaupun 'b' tidak adamyvar
.