2014-09-23 6 views
23

Я пытаюсь определить, как фильтровать некоторые наблюдения из большого набора данных, используя dplyr и grepl. Я не привязан к grepl, если другие решения будут более оптимальными.Фильтрация наблюдений в dplyr в сочетании с grepl

Возьмите этот образец ДФ:

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. отфильтровывает те случаи, начинающиеся с 'х'
  2. отфильтровывает те случаи, заканчивающиеся 'XX'

Мне удалось решить, как избавиться от всего, что содержит «x» или «xx», но не начиная с o r заканчивается на. Вот как избавиться от всего, с «хх» внутри (а не только заканчивается):

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, если это возможно.

ответ

31

Я не понимаю ваше второе регулярного выражения, но это более простое регулярное выражение, кажется, сделать трюк:

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. ^ и $ являются якорями регулярных выражений для начала и окончания строки соответственно. | - оператор OR. Мы отрицаем результаты grepl с !, поэтому мы находим строки, которые не соответствуют тому, что находится внутри регулярного выражения.

 Смежные вопросы

  • Нет связанных вопросов^_^