Фильтрация наблюдений в dplyr в сочетании с grepl
Я пытаюсь понять, как фильтровать некоторые наблюдения из большого набора данных с помощью dplyr
и grepl
. Я не женат на grepl
, если другие решения будут более оптимальными.
возьмите этот образец df:
df1 <- data.frame(fruit=c("apple", "orange", "xapple", "xorange",
"applexx", "orangexx", "banxana", "appxxle"), group=c("A", "B") )
df1
# fruit group
#1 apple A
#2 orange B
#3 xapple A
#4 xorange B
#5 applexx A
#6 orangexx B
#7 banxana A
#8 appxxle B
хочу:
- отфильтровать те случаи, начинающиеся с "x"
- отфильтровать те случаи, заканчивающиеся на 'xx'
мне удалось выяснить, как избавиться от всего, что содержит " x " или "xx", но не начинается и не заканчивается. Вот как избавиться от всего с " xx " внутри (а не только заканчивая):
df1 %>% filter(!grepl("xx",fruit))
# fruit group
#1 apple A
#2 orange B
#3 xapple A
#4 xorange B
#5 banxana A
это, очевидно, "ошибочно" (с моей точки зрения) фильтровал "appxxle".
Я никогда полностью не справлялся с регулярными выражениями. Я пытался изменить код, например: grepl("^(?!x).*$", df1$fruit, perl = TRUE)
чтобы попытаться заставить его работать в команде фильтра, но я не совсем понимаю.
ожидаемый результат:
# fruit group
#1 apple A
#2 orange B
#3 banxana A
#4 appxxle B
Я хотелось бы сделать это внутри dplyr
если это возможно.
1 ответов
Я не понял ваше второе регулярное выражение, но это более базовое регулярное выражение, кажется, делает трюк:
df1 %>% filter(!grepl("^x|xx$", fruit))
###
fruit group
1 apple A
2 orange B
3 banxana A
4 appxxle B
и я предполагаю, что вы знаете это, но вы не должны использовать dplyr
здесь вообще:
df1[!grepl("^x|xx$", df1$fruit), ]
###
fruit group
1 apple A
2 orange B
7 banxana A
8 appxxle B
регулярное выражение ищет строки, которые начинаются с x
и заканчивается xx
. The ^
и $
являются якорями регулярных выражений для начала и окончания строки соответственно. |
является оператором OR. Мы отрицаем результаты grepl
С !
Итак, мы находим строки, которые не соответствуют тому, что внутри регулярного выражения.