иногда я спрашиваю себя, почему R просто не использует слово содержит, чтобы упростить его пользователям
greg121
12
считать, что "in" содержится в "conta (in) s"; Я бы сказал, что «в» является довольно кратким соперником в этом контексте
хеджировал и улучшал
1
Возможно с добавлением фланкирующих %знаков-то есть. Слово inявляется зарезервированным словом в R, используемом в конструкции цикла for.
IRTFM
@ greg121 dplyr уже есть содержит функцию, но она используется для различных целей: для выбора столбца в кадре данных. Например select(iris, contains("etal")).
Поль Ружье
Есть ли краткий способ сделать это для вещественных чисел с заданной точностью?
млт
Ответы:
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
как насчет того, чтобы получить все появления, а не только первый?
StatsSorceress
Может быть, я немного опоздал. 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
Я знаю, что в документации сказано is.element(x, y) is identical to x %in% y. Но я не знаю почему, is.elementsработает при смешивании целых и %in%
числовых значений
@Pomber: Не могли бы вы привести пример этого?
Discipulus
@ 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]24
Чтобы найти все вхождения как логический вектор :
==
>'a'== v
[1]FALSETRUEFALSETRUEFALSE
Изменить: Удаление grep () и grepl () из списка по причине, указанной в комментариях
whichна самом деле предпочтительнее иногда, поскольку он дает вам все совпадающие позиции (в виде массива), в отличие от match. Хотя, возможно, это было не то, о чем просил ОП, в отличие от stackoverflow.com/questions/1169388/…
Fizz,
2
Зачем беспокоиться, whichесли вы просто хотите найти элементы не в Tset? Вы можете просто индексировать popнапрямую; pop[!pop%in%Tset]
Houshalter
13
Мне действительно нравятся grep () и grepl () для этой цели.
grep () возвращает вектор целых чисел, которые указывают, где находятся совпадения.
yo <- c("a","a","b","b","c","c")
grep("b", yo)[1]34
grepl () возвращает логический вектор с «TRUE» в месте совпадений.
yo <- c("a","a","b","b","c","c")
grepl("b", yo)[1]FALSEFALSETRUETRUEFALSEFALSE
По умолчанию grepв качестве первого элемента используется регулярное выражение, поэтому для точного соответствия "b"либо используйте, ^e$либо добавьте , fixed=TRUE).
reinierpost
10
Не используйте регулярные выражения для точных совпадений. Это опасно и может привести к неожиданным результатам
Дэвид Аренбург
9
Да, это ужасная, бесполезная, очень плохая идея - неэффективная и гарантированно сломанная. Например myvar <- 'blah'; grepl('b', myvar, fixed=TRUE), вернется, TRUEдаже если «б» не в myvar.
%
знаков-то есть. Словоin
является зарезервированным словом в R, используемом в конструкции цикла for.select(iris, contains("etal"))
.Ответы:
Для этого предназначены функции
match()
(возвращает первое появление) и%in%
(возвращает логическое значение).источник
which(v, 'b')
, Следите за порядком аргументов.which(v, 'b')
получаете мне сообщение об ошибке:> Ошибка, в которой (v, 'b'): аргумент для 'которого' не логиченis.element()
делает для более читабельного кода, и идентичен%in%
источник
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
функции.Я сгруппирую варианты, основанные на результатах. Предположим следующий вектор для всех примеров.
Для проверки наличия:
%в%
Любые()
is.element ()
Для нахождения первого случая:
матч()
Для нахождения всех вхождений как вектора индексов:
который()
Чтобы найти все вхождения как логический вектор :
==
Изменить: Удаление grep () и grepl () из списка по причине, указанной в комментариях
источник
grep()
или регулярные выражения для поиска точных совпадений.Функция any () обеспечивает читабельность кода
источник
%in%
:any(1==NA)
возвращаетсяNA
, где1 %in% NA
возвращаетсяFALSE
.any(1==NA, na.rm=TRUE)
возвращаетсяFALSE
.Вы можете использовать
%in%
оператор:источник
Также для нахождения позиции элемента «который» можно использовать как
и чтобы найти элементы, которые не содержатся в целевом векторе, можно сделать это:
источник
which
на самом деле предпочтительнее иногда, поскольку он дает вам все совпадающие позиции (в виде массива), в отличие отmatch
. Хотя, возможно, это было не то, о чем просил ОП, в отличие от stackoverflow.com/questions/1169388/…which
если вы просто хотите найти элементы не вTset
? Вы можете просто индексироватьpop
напрямую;pop[!pop%in%Tset]
Мне действительно нравятся grep () и grepl () для этой цели.
grep () возвращает вектор целых чисел, которые указывают, где находятся совпадения.
grepl () возвращает логический вектор с «TRUE» в месте совпадений.
Эти функции чувствительны к регистру.
источник
grep
в качестве первого элемента используется регулярное выражение, поэтому для точного соответствия"b"
либо используйте,^e$
либо добавьте, fixed=TRUE
).myvar <- 'blah'; grepl('b', myvar, fixed=TRUE)
, вернется,TRUE
даже если «б» не вmyvar
.