Проверить, содержит ли вектор данный элемент

347

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

  • 35
    иногда я спрашиваю себя, почему R просто не использует слово содержит, чтобы облегчить пользователям
  • 10
    считать, что "in" содержится в "conta (in) s"; Я бы сказал, что "в" является довольно кратким соперником в этом контексте
Показать ещё 4 комментария
Теги:
vector
r-faq

7 ответов

374
Лучший ответ

Для этого предназначены как 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
  • 0
    а как насчет получения всех появлений, а не только первый?
  • 0
    Может быть, я немного опоздал. which(v, 'b') . Следите за порядком аргументов.
138

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) is identical to x %in% y . Но я не знаю, почему is.elements работает при смешивании целых и is.elements а %in% - нет
  • 0
    @Pomber: Не могли бы вы привести пример этого?
53

Функция any() делает для читаемого кода

> 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
  • 8
    Имейте в виду, что это ведет себя иначе, чем %in% : any(1==NA) возвращает NA , где 1 %in% NA возвращает FALSE .
32

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

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

Также, чтобы найти положение элемента "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))]
  • 0
    which на самом деле предпочтительнее, поскольку дает вам все совпадающие позиции (в виде массива), в отличие от match . Хотя, возможно, это было не то, о чем просил ОП, в отличие от stackoverflow.com/questions/1169388/…
  • 0
    Зачем беспокоиться , which , если вы просто хотите , чтобы найти элементы , которые не в Tset ? Вы можете просто индексировать pop прямо; pop[!pop%in%Tset]
14

Мне очень нравятся 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" использовать ^e$ или add , fixed=TRUE ).
  • 8
    Не используйте регулярные выражения для точных совпадений. Это опасно и может привести к неожиданным результатам
Показать ещё 1 комментарий
9

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

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('a' == v)
[1] 2 4

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

==

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

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

  • 6
    Как уже отмечалось здесь и здесь , не используйте grep() или регулярные выражения для поиска точных совпадений.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню