The %in%
Operator memberitahu Anda yang unsur antara numers untuk menghapus:
> a <- sample (1 : 10)
> remove <- c (2, 3, 5)
> a
[1] 10 5 2 7 1 6 3 4 8 9
> a %in% remove
[1] FALSE TRUE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
> a [! a %in% remove]
[1] 10 7 1 6 4 8 9
Perhatikan bahwa ini akan secara diam-diam menghapus yang tidak dapat dibandingkan (hal-hal seperti NA
atau Inf)
juga (sementara itu akan menjaga nilai duplikat a
selama mereka tidak terdaftar di remove
).
Jika a
dapat berisi yang tak tertandingi, tetapi remove
tidak akan, kita bisa menggunakan match
, mengatakan itu untuk kembali 0
untuk yang tidak cocok dan tak tertandingi ( %in%
adalah jalan pintas yang mudah untuk match
):
> a <- c (a, NA, Inf)
> a
[1] 10 5 2 7 1 6 3 4 8 9 NA Inf
> match (a, remove, nomatch = 0L, incomparables = 0L)
[1] 0 3 1 0 0 0 2 0 0 0 0 0
> a [match (a, remove, nomatch = 0L, incomparables = 0L) == 0L]
[1] 10 7 1 6 4 8 9 NA Inf
incomparables = 0
tidak diperlukan karena tidak ada bandingannya yang tidak akan cocok, tapi saya akan memasukkannya agar mudah dibaca.
Ini, btw., Apa yang setdiff
dilakukan secara internal (tetapi tanpa unique
membuang duplikat a
yang tidak ada di dalamnya remove
).
Jika remove
mengandung yang tak tertandingi, Anda harus memeriksanya satu per satu, mis
if (any (is.na (remove)))
a <- a [! is.na (a)]
(Ini tidak membedakan NA
dari NaN
tetapi manual R anyways memperingatkan bahwa seseorang tidak boleh mengandalkan memiliki perbedaan di antara mereka)
Untuk Inf
/ -Inf
Anda harus memeriksa keduanya sign
danis.finite
cbeleites tidak senang dengan SX
sumber
setdiff
lebih baik, karena melakukan segalanya dalam satu operasi, dan referensi vektor yang diubah hanya sekali.a
yang tidak adaremove
juga. Jika itu bukan masalah, Anda juga bisa menggunakannyasetdiff
.setdiff
, btw, menggunakanmatch
yang%in%
merupakan jalan pintas.Anda bisa menggunakannya
setdiff
.Diberikan
Kemudian
sumber
a
adalah hasil dari fungsi lain sehingga Anda dapat melakukan hal-hal dalam satu baris, bukan 3 dan variabel temp%in%
solusi jika vektor input berisi duplikat (dalam halsetdiff
ini hanya akan mengembalikan set unik , yaitu tanpa duplikat)fsetdiff
daridata.table
paket memilikiall
bendera (bawaan F) yang memungkinkan untuk menjaga duplikat di vektor input.Anda dapat melakukannya sebagai berikut:
Segera
sumber
which
sini. Ini pada dasarnya sama dengan jawaban @cbeleites.which
mengembalikan indeks nilai TRUE. Jadi tanda minus dapat digunakan untuk mengatakan "indeks selain dari indeks ini". Jugawhich
lebih mudah dibaca karena lebih dekat dengan bahasa alami.dari pada
menggunakan paket
purrr
danmagrittr
, Anda dapat melakukan:ini memungkinkan untuk
subset
menggunakan nama vektor hanya sekali. Dan Anda bisa menggunakannya di pipa :)sumber
Pertama kita dapat mendefinisikan operator baru,
Kemudian, seperti x tidak di hapus
atau mengapa harus dihapus, langsung saja
sumber
MEMPERBARUI:
Semua jawaban di atas tidak akan berfungsi untuk nilai yang diulang, jawaban @ BenBolker menggunakan
duplicated()
predikat memecahkan ini:Jawaban Asli: di sini saya menulis sedikit fungsi untuk ini:
jadi, katakan saja
full_vector=c(1,2,3,4,1)
dansearched_vector=c(1,2,3)
.exclude_val(full_vector,searched_vector)
akan kembali (4,1), namun jawaban di atas akan kembali dengan adil(4)
.sumber
full_vector[!full_vector %in% searched_vector | duplicated(full_vector)]
?full_vector = c(1,1,1,2,3); searched_vector = c(1,1,3);
- yang menghasilkan1, 1, 2
alih-alih jawaban yang benar1, 2
.removeif <- function(from, where) { for (i in where) if (i %in% from) {from = from[-match(i, from)]}; from}
Ini menetapkan 13 dalam vektor menjadi bukan angka (NAN) yang menunjukkan false remove (q [c (11,12,13)])) jika Anda mencoba ini, Anda akan melihat bahwa fungsi hapus tidak bekerja pada nomor vektor. Anda menghapus seluruh vektor tetapi mungkin bukan elemen tunggal.
sumber
Ada juga
subset
yang kadang berguna:sumber