Как проверить, содержит ли вектор заданное значение?
%знаков-то есть. Слово 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).