Перевірте, чи містить вектор заданий елемент


518

Як перевірити, чи містить вектор задане значення?


38
Іноді я запитую себе, чому R просто не використовує слово містить, щоб полегшити користувачам
greg121

12
врахуйте, що "в" міститься в "контакт (in) s"; Я заперечую, що "в" є значно лаконічним суперником у цьому контексті
hedgedandlevered

1
Можливо, з додаванням фланки- %знаків, що є. Слово in- це зарезервоване слово, яке використовується в R для побудови для циклу.
IRTFM

@ greg121 dplyr вже має функцію містить , але вона використовується для іншої мети: для вибору стовпця в кадрі даних. Наприклад 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

як щодо отримання всіх виступів, а не лише перших?
СтатистикаSorceress

Можливо, я приходжу трохи пізно. which(v, 'b'). Майте на увазі порядок аргументів.
Ніклас Мертч

Ви which(v, 'b')даєте мені повідомлення про помилку:> Помилка, у якій (v, 'b'): аргумент до 'котрий' не є логічним
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%не
pomber

@pomber: Ви можете навести приклад цього?
дисципліна

@pomber це виправлено?
vasili111

2
Вища читаність is.element()проти %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('a' == v)
[1] 2 4

Для знаходження всіх подій як логічного вектора :

==

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

Редагувати: Видалення grep () та grepl () зі списку з причини, зазначеної в коментарях


6
Як уже коментували тут і тут , не використовуйте grep()та не регулярні вирази, щоб знайти точні збіги.
Уве

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)повертається NA, де 1 %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

Також знайти позицію елемента "який" можна використовувати як

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насправді бажано іноді, оскільки він дає вам всі відповідні позиції (як масив), на відміну від match. Хоча це, можливо, не те, про що просила ОП, на відміну від stackoverflow.com/questions/1169388/…
Fizz

2
Навіщо турбуватися, whichякщо ви просто хочете знайти елементи не в Tset? Ви можете просто індексувати popбезпосередньо; pop[!pop%in%Tset]
Houshalter

13

Мені дуже подобаються grepl () і 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$або додавати , fixed=TRUE).
reinierpost

10
Не використовуйте регулярні вирази для точних відповідностей. Це небезпечно і може мати неочікувані результати
Девід Аренбург

9
Так, це жахлива, не гарна, дуже погана ідея - неефективна і гарантована зламаність. Наприклад myvar <- 'blah'; grepl('b', myvar, fixed=TRUE), повернеться, TRUEхоча "b" не знаходиться в myvar.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.