Bir vektörün belirli bir değer içerip içermediğini nasıl kontrol edebilirim?
%
kuşatma eklenmesi ile -bu imzalar. Kelime in
, ilmek yapısında R kullanımında ayrılmış bir kelimedir.
select(iris, contains("etal"))
.
Bir vektörün belirli bir değer içerip içermediğini nasıl kontrol edebilirim?
%
kuşatma eklenmesi ile -bu imzalar. Kelime in
, ilmek yapısında R kullanımında ayrılmış bir kelimedir.
select(iris, contains("etal"))
.
Yanıtlar:
Hem match()
(ilk görünümü döndürür) hem de %in%
(bir Boole döndürür) işlevleri bunun için tasarlanmıştır.
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')
. Argümanların sırasına dikkat edin.
which(v, 'b')
mantıklı değil 'hangi' için argüman: Bana bir hata mesajı verir:> Hata hangi (v, 'b') 'de
is.element()
daha okunabilir bir kod oluşturur ve %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
. Ama, neden bilmiyorum, is.elements
tamsayılar ve sayısallar karıştırırken çalışır ve %in%
yapmaz
is.element()
vs %in%
sübjektiftir. Bir infix operatörünün argümanlar sırasında belirsizliği ortadan kaldırdığı için daha okunabilir olduğu bir durum ortaya çıkabilir. apple in fruit
mantıklı, fruit in apple
değil. is.element(apple, fruit)
veya is.element(fruit, apple)
her ikisi de is.element
işlevin uygulanmasına bağlı olarak doğru olabilir .
Seçenekleri çıktıya göre gruplandıracağım. Tüm örnekler için aşağıdaki vektörü varsayalım.
v <- c('z', 'a','b','a','e')
Varlığını kontrol etmek için:
%içinde%
> 'a' %in% v
[1] TRUE
hiç()
> any('a'==v)
[1] TRUE
is.element ()
> is.element('a', v)
[1] TRUE
İlk olayı bulmak için:
eşleşme()
> match('a', v)
[1] 2
Tüm oluşumları indeks vektörü olarak bulmak için:
hangi()
> which('a' == v)
[1] 2 4
Tüm olayları mantıksal vektör olarak bulmak için :
==
> 'a' == v
[1] FALSE TRUE FALSE TRUE FALSE
Düzenleme: Yorumlarda belirtilen nedenden dolayı grep () ve grepl () listesinden kaldırılıyor
Herhangi bir () okunabilir kod fonksiyon markaları
> 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
any(1==NA, na.rm=TRUE)
geri döner FALSE
.
Ayrıca "hangi" olarak kullanılabilir elemanın konumunu bulmak için
pop <- c(3,4,5,7,13)
which(pop==13)
ve hedef vektörde bulunmayan elemanları bulmak için, bunu yapabiliriz:
pop <- c(1,2,4,6,10)
Tset <- c(2,10,7) # Target set
pop[which(!(pop%in%Tset))]
which
aslında bazen size uygun tüm pozisyonları verir (dizi olarak), aksine match
. Bu OP'nin istediği şey olmasa da, stackoverflow.com/questions/1169388/…
which
Sadece içinde olmayan öğeleri bulmak istiyorsanız neden uğraşmalısınız Tset
? Sadece pop
doğrudan indeksleyebilirsiniz ; pop[!pop%in%Tset]
Bu amaç için grep () ve grepl () 'i gerçekten seviyorum.
grep (), eşleşmelerin nerede olduğunu gösteren bir tamsayı vektörü döndürür.
yo <- c("a", "a", "b", "b", "c", "c")
grep("b", yo)
[1] 3 4
grepl (), eşleşmeler konumunda "TRUE" ile mantıksal bir vektör döndürür.
yo <- c("a", "a", "b", "b", "c", "c")
grepl("b", yo)
[1] FALSE FALSE TRUE TRUE FALSE FALSE
Bu işlevler büyük / küçük harfe duyarlıdır.
grep
normal ifadeyi ilk öğesi olarak alır; bu nedenle "b"
, kullanın ^e$
veya ekleyin , fixed=TRUE
) için tam eşleşme yapın ).