В R, как вы проверяете вектор, чтобы увидеть, содержит ли он данный элемент?тест, если вектор содержит данный элемент
ответ
Для этого предназначены как 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
Вы можете использовать %in%
оператор:
vec <- c(1, 2, 3, 4, 5)
1 %in% veC# true
10 %in% veC# false
любой() функция делает читаемый код
> 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
Знайте, что это ведет себя иначе, чем '% in%': 'any (1 == NA)' возвращает 'NA', где' 1% in% NA' возвращает 'FALSE'. – dash2
Кроме того, чтобы найти положение элемента "который" может использоваться как
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))]
'' 'который на самом деле предпочтительнее, иногда для него дает вам * все * соответствующие позиции (в виде массива), в отличие от' match'. Хотя это, возможно, не то, о чем попросил ОП, в отличие от http://stackoverflow.com/questions/1169388/finding-multiple-elements-in-a-vector – Fizz
Зачем беспокоиться о 'том', если вы просто хотите найти элементы не в 'Tset'? Вы можете просто индексировать 'pop' напрямую; 'pop [! pop% in% Tset]' – Houshalter
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
Я знаю, что в документации указано, что 'is.element (x, y) идентичен x% в% y'. Но, я не знаю, почему, 'is.elements' работает при смешении целых чисел и цифр и'% in% 'не – pomber
@pomber: Не могли бы вы привести пример этого? – discipulus
Я действительно как 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
Эти функции чувствительны к регистру.
По умолчанию 'grep' принимает регулярное выражение в качестве своего первого элемента, поэтому для точного соответствия для' 'b" 'используйте либо'^e $ ', либо add', fixed = TRUE'. – reinierpost
Не используйте регулярное выражение для точных совпадений. Это опасно и может иметь неожиданные результаты. –
Да, это ужасная, хорошая, очень плохая идея - неэффективна и гарантированно сломается. Например. 'myvar <- 'blah'; grepl ('b', myvar, fixed = TRUE) 'вернет' TRUE', хотя 'b' не находится в 'myvar'. – dash2
Я буду группировать параметры, основанные на выходе. Предположим для всех примеров следующий вектор.
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() из списка причин, упомянутых в комментариях
Как уже отмечалось [здесь] (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
иногда я спрашиваю себя, почему R просто не использует слово содержит, чтобы сделать его пользователям проще – greg121
считают, что «в» содержится в "содержит"; Я бы утвердил, что «in» является значительно сжатым соперником в этом контексте. – hedgedandlevered
Возможно, с добавлением фланговых «% -signs». Слово 'in' является зарезервированным словом в R для построения конвейера. –