Як перевірити, чи містить вектор задане значення?
%
знаків, що є. Слово in
- це зарезервоване слово, яке використовується в R для побудови для циклу.
Як перевірити, чи містить вектор задане значення?
%
знаків, що є. Слово in
- це зарезервоване слово, яке використовується в 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
which(v, 'b')
. Майте на увазі порядок аргументів.
which(v, 'b')
даєте мені повідомлення про помилку:> Помилка, у якій (v, 'b'): аргумент до 'котрий' не є логічним
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) is identical to x %in% y
. Але, я не знаю чому, is.elements
працює при змішуванні цілих чисел та чисел, а %in%
не
is.element()
проти %in%
суб'єктивна. Можна зробити випадок, що оператор інфіксації є більш читабельним, оскільки він виключає неоднозначність у порядку аргументів. apple in fruit
має сенс, fruit in apple
не робить. is.element(apple, fruit)
або вони is.element(fruit, apple)
можуть бути правильними залежно від реалізації is.element
функції.
Я згрупую параметри на основі результатів. Припустимо наступний вектор для всіх прикладів.
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 () зі списку з причини, зазначеної в коментарях
У будь-якому () функція робить для читаного коду
> 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
.
any(1==NA, na.rm=TRUE)
повертає FALSE
.
Також знайти позицію елемента "який" можна використовувати як
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/…
which
якщо ви просто хочете знайти елементи не в Tset
? Ви можете просто індексувати pop
безпосередньо; pop[!pop%in%Tset]
Мені дуже подобаються 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
Ці функції залежать від регістру.
grep
приймає регулярний вираз у якості свого першого елемента, тому слід точно відповідати "b"
, або використовувати, ^e$
або додавати , fixed=TRUE
).