2009-07-23 4 views
363

В R, как вы проверяете вектор, чтобы увидеть, содержит ли он данный элемент?тест, если вектор содержит данный элемент

+28

иногда я спрашиваю себя, почему R просто не использует слово содержит, чтобы сделать его пользователям проще – greg121

+8

считают, что «в» содержится в "содержит"; Я бы утвердил, что «in» является значительно сжатым соперником в этом контексте. – hedgedandlevered

+1

Возможно, с добавлением фланговых «% -signs». Слово 'in' является зарезервированным словом в R для построения конвейера. –

ответ

373

Для этого предназначены как 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 
31

Вы можете использовать %in% оператор:

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

любой() функция делает читаемый код

> 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 
+4

Знайте, что это ведет себя иначе, чем '% in%': 'any (1 == NA)' возвращает 'NA', где' 1% in% NA' возвращает 'FALSE'. – dash2

15

Кроме того, чтобы найти положение элемента "который" может использоваться как

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

'' 'который на самом деле предпочтительнее, иногда для него дает вам * все * соответствующие позиции (в виде массива), в отличие от' match'. Хотя это, возможно, не то, о чем попросил ОП, в отличие от http://stackoverflow.com/questions/1169388/finding-multiple-elements-in-a-vector – Fizz

+0

Зачем беспокоиться о 'том', если вы просто хотите найти элементы не в 'Tset'? Вы можете просто индексировать 'pop' напрямую; 'pop [! pop% in% Tset]' – Houshalter

136

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 
+5

Я знаю, что в документации указано, что 'is.element (x, y) идентичен x% в% y'. Но, я не знаю, почему, 'is.elements' работает при смешении целых чисел и цифр и'% in% 'не – pomber

+0

@pomber: Не могли бы вы привести пример этого? – discipulus

8

Я действительно как 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 

Эти функции чувствительны к регистру.

+8

По умолчанию 'grep' принимает регулярное выражение в качестве своего первого элемента, поэтому для точного соответствия для' 'b" 'используйте либо'^e $ ', либо add', fixed = TRUE'. – reinierpost

+8

Не используйте регулярное выражение для точных совпадений. Это опасно и может иметь неожиданные результаты. –

+8

Да, это ужасная, хорошая, очень плохая идея - неэффективна и гарантированно сломается. Например. 'myvar <- 'blah'; grepl ('b', myvar, fixed = TRUE) 'вернет' TRUE', хотя 'b' не находится в 'myvar'. – dash2

15

Я буду группировать параметры, основанные на выходе. Предположим для всех примеров следующий вектор.

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

Для проверки наличия:

% в%

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

любой()

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

есть.элемент()

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

Для нахождения первого вхождения:

матча()

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

Для нахождения всех возникновений как вектор индексов:

которого()

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

Для нахождения всех мест где, как логический вектор:

==

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

Редактировать: Удаление Grep() и grepl() из списка причин, упомянутых в комментариях

+5

Как уже отмечалось [здесь] (https://stackoverflow.com/questions/1169248/r-function-for-testing-if-a-vector-contains-a-given-element/34056066#comment66181358_34056066) и [здесь] (https://stackoverflow.com/questions/1169248/r-function-for-testing-if-a-vector-contains-a-given-element/34056066#comment73025314_34056066), не используйте 'grep()' или регулярные выражения для поиска точных совпадений. – Uwe