Фильтрация наблюдений в 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

хочу:

  1. отфильтровать те случаи, начинающиеся с "x"
  2. отфильтровать те случаи, заканчивающиеся на '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 С ! Итак, мы находим строки, которые не соответствуют тому, что внутри регулярного выражения.