Я пытаюсь использовать, grep
чтобы проверить, присутствует ли вектор строк в другом векторе или нет, и для вывода значений, которые присутствуют (соответствующие шаблоны).
У меня есть такой фрейм данных:
FirstName Letter
Alex A1
Alex A6
Alex A7
Bob A1
Chris A9
Chris A6
У меня есть вектор шаблонов строк можно найти в столбцах «Letter», например: c("A1", "A9", "A6")
.
Я хотел бы проверить, присутствует ли какая-либо из строк в векторе шаблона в столбце «Буква». Если они есть, я хотел бы получить уникальные значения.
Проблема в том, что я не знаю, как использовать grep
несколько шаблонов. Я попытался:
matches <- unique (
grep("A1| A9 | A6", myfile$Letter, value=TRUE, fixed=TRUE)
)
Но он дает мне 0 совпадений, что не соответствует действительности, какие-либо предложения?
fixed=TRUE
потому что ваш шаблон является истинным регулярным выражением.match
или%in%
или даже==
- единственный правильный способ сравнить точные совпадения. регулярное выражение очень опасно для такой задачи и может привести к неожиданным результатам.Ответы:
В дополнение к комментарию @Marek об исключении
fixed==TRUE
, вам также нужно не иметь пробелов в вашем регулярном выражении. Так и должно быть"A1|A9|A6"
.Вы также упомянули, что существует множество шаблонов. Предполагая, что они находятся в векторе
Затем вы можете создать свое регулярное выражение напрямую, используя
paste
иcollapse = "|"
.источник
toMatch %in% myfile$Letter
?Хорошие ответы, но не забывайте про
filter()
dplyr:источник
grepl
работает одновременно с одним шаблоном (нам нужен вектор длиной 1), у нас есть 3 шаблона (вектор длины 3), поэтому мы можем объединить их с одним, используя какой-нибудь удобный для grepl разделитель -|
попробуйте удачи с другим :))|(
для отдельных моделей может сделать это более надежным:paste0("(", paste(patterns, collapse=")|("),")")
. К сожалению, это становится немного менее элегантным. В результате получается узор(A1)|(A9)|(A6)
.Это должно работать:
Или еще проще:
источник
%like%
не входит в базовый R, поэтому вы должны указать, какие пакеты необходимы для его использования.%like%
это частьdata.table
пакета. Кроме того, похоже наdata.table
этоlike(...)
,%ilike%
и%flike%
.Основываясь на сообщении Брайана Дигга, вот две полезные функции для фильтрации списков:
источник
Вы пробовали функции
match()
илиcharmatch()
?Пример использования:
источник
match
что он не использует шаблоны, он ожидает точного совпадения.Не уверен, что этот ответ уже появлялся ...
Для конкретного шаблона в вопросе вы можете просто сделать это с помощью одного
grep()
вызова,источник
Чтобы добавить к ответу Брайана Диггса.
другой способ использования grepl вернет фрейм данных, содержащий все ваши значения.
Может, чище ... может?
источник
Уберите пробелы. Ну действуй:
источник
Используя
sapply
источник
Я предлагаю написать небольшой скрипт и выполнить несколько поисков с помощью Grep. Я никогда не находил способа найти несколько шаблонов, и, поверьте, я искал!
Так, ваш файл оболочки со встроенной строкой:
Затем запустите, набрав myshell.sh.
Если вы хотите передать строку в командной строке, сделайте это так, с аргументом оболочки - это нотация bash, кстати:
И так далее.
Если нужно сопоставить много шаблонов, вы можете поместить его в цикл for.
источник