Bir vektörün belirli bir öğe içerip içermediğini test edin


518

Bir vektörün belirli bir değer içerip içermediğini nasıl kontrol edebilirim?


38
bazen kendime neden R kelimesinin kullanıcıları daha kolay hale getirmek için içerdiği kelimeyi kullanmadığını
soruyorum

12
"in" in "conta (in) s" içinde bulunduğunu düşünün; Ben "in" bu bağlamda oldukça özlü bir yarışmacı olduğunu iddia ediyorum
hedgedandlevered

1
Belki %kuşatma eklenmesi ile -bu imzalar. Kelime in, ilmek yapısında R kullanımında ayrılmış bir kelimedir.
IRTFM

@ greg121 dplyr zaten var içeren fonksiyon, ancak farklı bir amaç için kullanılır: bir veri çerçevesi içinde bir sütun seçmek için kullanılır. Örneğin select(iris, contains("etal")).
Paul Rougieux

Belirli bir hassasiyetle gerçek değerli sayılar için bunu yapmanın kısa bir yolu var mı?
mlt

Yanıtlar:


500

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

sadece birincisi değil, tüm görünümleri almaya ne dersiniz?
İstatistikler

Belki biraz geç gelirim. which(v, 'b'). Argümanların sırasına dikkat edin.
Niklas Mertsch

Sizin which(v, 'b')mantıklı değil 'hangi' için argüman: Bana bir hata mesajı verir:> Hata hangi (v, 'b') 'de
Capt.Krusty

176

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

6
Belgelerin dediğini biliyorum is.element(x, y) is identical to x %in% y. Ama, neden bilmiyorum, is.elementstamsayılar ve sayısallar karıştırırken çalışır ve %in%yapmaz
bombacı

@pomber: Buna bir örnek verebilir misiniz?
discipulus

@pomber düzeltildi mi?
vasili111

2
Üstün okunabilirlik 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 fruitmantıklı, fruit in appledeğil. is.element(apple, fruit)veya is.element(fruit, apple)her ikisi de is.elementişlevin uygulanmasına bağlı olarak doğru olabilir .
rileymcdowell

70

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


6
Burada ve burada zaten yorumlandığı gibi , grep()kesin eşleşmeleri bulmak için veya düzenli ifadeler kullanmayın .
Uwe

69

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

9
Bunun şunlardan farklı davrandığını unutmayın %in%: any(1==NA)iadeler NA, 1 %in% NAiadeler FALSE.

@ user3603486: any(1==NA, na.rm=TRUE)geri döner FALSE.
AkselA

36

%in%Operatörü kullanabilirsiniz :

vec <- c(1, 2, 3, 4, 5)
1 %in% vec # true
10 %in% vec # false

19

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))]

whichaslında bazen size uygun tüm pozisyonları verir (dizi olarak), aksine match. Bu OP'nin istediği şey olmasa da, stackoverflow.com/questions/1169388/…
Fizz'in

2
whichSadece içinde olmayan öğeleri bulmak istiyorsanız neden uğraşmalısınız Tset? Sadece popdoğrudan indeksleyebilirsiniz ; pop[!pop%in%Tset]
Houshalter

13

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.


10
Varsayılan olarak, grepnormal ifadeyi ilk öğesi olarak alır; bu nedenle "b", kullanın ^e$veya ekleyin , fixed=TRUE) için tam eşleşme yapın ).
reinierpost

10
Tam eşleşmeler için normal ifade kullanmayın. Bu tehlikelidir ve beklenmedik sonuçlara yol açabilir
David Arenburg

9
Evet, bu korkunç, iyi, çok kötü bir fikir değil - verimsiz ve kırılması garanti. 'B' olmasa bile, örneğin myvar <- 'blah'; grepl('b', myvar, fixed=TRUE)dönecektir . TRUEmyvar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.