ベクトルに特定の要素が含まれているかどうかをテストする


518

ベクトルに特定の値が含まれているかどうかを確認するにはどうすればよいですか?


38
Rは、言葉だけがユーザーやすくするために含まれている使用していない理由を、時々私は自分自身に尋ねる
greg121

12
「in」が「conta(in)s」に含まれていることを考慮してください。私は、この文脈ではかなり簡潔な候補である「中」と主張するだろう
hedgedandlevered

1
おそらく、側面に- %記号が追加されています。この単語inは、forループの構築でRが使用する予約語です。
IRTFM 2016

@ greg121 dplyrには既にcontains関数がありますが、それは別の目的で使用されます。データフレームで列を選択するためです。例えばselect(iris, contains("etal"))
ポールルージュ

与えられた精度で実際の数値に対してそれを行う簡潔な方法はありますか?
mlt

回答:


500

両方match()(戻り初登場)及び%in%(戻りブール)関数は、このために設計されています。

v <- c('a','b','c','e')

'b' %in% v
## returns TRUE

match('b',v)
## returns the first location of 'b', in this case: 2

最初の外観だけでなく、すべての外観を取得するのはどうですか?
StatsSorceress 2018年

少し遅れて来るかもしれません。which(v, 'b')。引数の順序に注意してください。
Niklas Mertsch

あなたwhich(v, 'b')は私にエラーメッセージを与えます:> Error in which(v、 'b'): 'which'への引数は論理的ではありません
Capt.Krusty

176

is.element() より読みやすいコードを作成し、と同じです %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
ドキュメンテーションは言うことを知っていますis.element(x, y) is identical to x %in% y。しかし、理由はわかりませんがis.elements、整数と数値を混在させた場合に機能し、機能%in%しません
2014

@pomber:この例を挙げていただけますか?
弟子、2017年

@pomber修正されましたか?
vasili111

2
優れた読みやすさis.element()vs %in%は主観的です。中置演算子は、引数の順序のあいまいさを排除するため、より読みやすい場合があります。apple in fruit意味がありfruit in appleません。is.element(apple, fruit)またはis.element(fruit, apple)is.element関数の実装によってはどちらも正しい可能性があります。
rileymcdowell

70

出力に基づいてオプションをグループ化します。すべての例で次のベクトルを想定します。

v <- c('z', 'a','b','a','e')

存在を確認する場合:

%に%

> 'a' %in% v
[1] TRUE

どれか()

> any('a'==v)
[1] TRUE

is.element()

> is.element('a', v)
[1] TRUE

最初の出現を見つけるには:

一致()

> match('a', v)
[1] 2

すべての出現をインデックスのベクトルとして見つけるには:

which()

> which('a' == v)
[1] 2 4

すべての出現を論理ベクトルとして見つけるには

==

> 'a' == v
[1] FALSE  TRUE FALSE  TRUE FALSE

編集:コメントに記載されている理由により、リストからgrep()およびgrepl()を削除


6
すでにここここでコメントいるようにgrep()や正規表現を使用して完全一致を検索しないでください。
Uwe

69

任意の()で読み取り可能なコードの関数になり

> 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
これは異なる動作を注意してください%in%any(1==NA)戻りNA1 %in% NA戻りますFALSE

@ user3603486:をany(1==NA, na.rm=TRUE)返しますFALSE
AkselA

36

%in%演算子を使用できます。

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

19

また、「which」として使用できる要素の位置を見つけるには、

pop <- c(3,4,5,7,13)

which(pop==13)

また、ターゲットベクトルに含まれていない要素を見つけるには、次のようにします。

pop <- c(1,2,4,6,10)

Tset <- c(2,10,7)   # Target set

pop[which(!(pop%in%Tset))]

whichとは異なり、(配列として)すべての一致する位置を取得できるため、実際にはが望ましい場合がありますmatchstackoverflow.com/questions/1169388/…
Fizz

2
whichない要素を見つけたいだけなのに、どうして気になるのTsetですか?pop直接インデックスを付けることができます。pop[!pop%in%Tset]
Houshalter 2017

13

私はこの目的のためにgrep()とgrepl()が本当に好きです。

grep()は、一致の場所を示す整数のベクトルを返します。

yo <- c("a", "a", "b", "b", "c", "c")

grep("b", yo)
[1] 3 4

grepl()は、一致する位置に「TRUE」を含む論理ベクトルを返します。

yo <- c("a", "a", "b", "b", "c", "c")

grepl("b", yo)
[1] FALSE FALSE  TRUE  TRUE FALSE FALSE

これらの関数では大文字と小文字が区別されます。


10
デフォルトでgrepは、最初の要素として正規表現を"b"使用するため、を完全に一致させるには、use ^e$またはaddのいずれかを使用します, fixed=TRUE
reinierpost 2016年

10
完全一致には正規表現を使用しないでください。これは危険であり、予期しない結果が生じる可能性があります
David Arenburg '10

9
ええ、これはひどい、良くない、非常に悪い考えです-非効率的で壊れることが保証されています。たとえば、「b」がにない場合でもmyvar <- 'blah'; grepl('b', myvar, fixed=TRUE)戻ります。TRUEmyvar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.