Как проверить, содержит ли вектор заданное значение?
%
знаков-то есть. Слово in
является зарезервированным словом в R, используемом в конструкции цикла for.
select(iris, contains("etal"))
.
Как проверить, содержит ли вектор заданное значение?
%
знаков-то есть. Слово in
является зарезервированным словом в R, используемом в конструкции цикла for.
select(iris, contains("etal"))
.
Ответы:
Для этого предназначены функции 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 () из списка по причине, указанной в комментариях
Функция 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
%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]
Мне действительно нравятся 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$
либо добавьте , fixed=TRUE
).