2015-03-12 2 views
2

Я пытаюсь создать фильтр для удаления строк из набора данных, используя вместе grep и subset вместе.Множественный фильтр с использованием grep и подмножества в R

Пример набора данных:

id <- 1:10 
problem <- c("a" , "b", "c", "d", "a","b","c","a", "b", "a") 
solution1 <- c("eat", "sleep", "drink", "play", "sleep", "play", "play", "drink", "play", "eat") 
solution2 <- c("read", "read", "eat", "drink", "eat", "sleep", "eat", "read", "eat", "play") 
df <- c(id, problem, solution1, solution2) 

Я пытаюсь удалить эти строки с проблемой «а» и есть «съесть» в любом solution1 или solution2.

В результате он должен удалить идентификатор 1, 5 и 10.

Я попытался с помощью:

df <- subset(df, problem=="a" & !(grepl("eat", df))) 

и

df <- df[!grepl("eat", df) & grepl("a", df$problem)] 

Не могу найти аналогичный решение на StackOverflow или на других сайтах I Googled.

Буду признателен, если кто-нибудь может помочь. Благодаря!

ответ

4

Во-первых, если вы хотите dataframe, вы должны использовать data.frame, а не с:

df <- data.frame(id, problem, solution1, solution2) 

Тогда вы можете подмножество, как это, например, (нет необходимости использовать подмножество само по себе)

df2 <- df[!(grepl("a", df$problem) & 
      (grepl("eat", df$solution1) | 
      grepl("eat", solution2))),] 

# id problem solution1 solution2 
# 2 2  b  sleep  read 
# 3 3  c  drink  eat 
# 4 4  d  play  drink 
# 6 6  b  play  sleep 
# 7 7  c  play  eat 
# 8 8  a  drink  read 
# 9 9  b  play  eat 
+0

Нет проблем. Не забудьте принять любой ответ, который вы принимаете! :) –

+0

ОК спасибо. сделаю .. впервые используя это. но тот же вопрос на другом плакате, решение хорошо работает на этих образцах данных, но когда я применяю его к моему считываемому набору данных, ваше решение дает мне этот результат: Ошибка: неожиданный ',' in: "(grepl (" Digoxin " , данные $ Med_7_Name | grepl («Дигоксин», данные $ Med_8_Name))), «Дигоксин должен быть похож на eat и Med_7_Name - это решение1. Есть ли что-то, о чем я должен знать? –

+0

Закрывающая скобка отсутствует после данных $ Med_7_Name –

0

Я хотел бы сделать это:

df <- df[!(df$problem %in% "a" & (df$solution1 %in% "eat" | df$solution2 %in% "eat")),] 

# id problem solution1 solution2 
# 2 2  b  sleep  read 
# 3 3  c  drink  eat 
# 4 4  d  play  drink 
# 6 6  b  play  sleep 
# 7 7  c  play  eat 
# 8 8  a  drink  read 
# 9 9  b  play  eat 

регулярное выражение не является действительно необходимым здесь, если сравнивать точные строки. Использование %in% для подмножества сэкономит вам много времени, поскольку оно сравнивает векторы. например вместо "a" могли быть c("a", "b", "c") и т. д.

+0

спасибо! ваше решение тоже работает. однако, когда я пытаюсь применить оба решения к моему реальному набору данных, строка, предназначенная для фильтрации, не удаляется. я все равно получаю df с таким же количеством строк. есть ли что-нибудь, что я не делаю правильно или должен знать? –

+0

Скорее всего, проблема заключается в имени имени фрейма или имени столбца, убедитесь, что вы соответствующим образом адаптируете код к вашему набору данных. И .. скобки. Они часто являются источником опечаток. –

+0

спасибо. Я дважды проверял имена и даже использовал номер столбца. переменная также является символом. застрял! в любом случае, спасибо за вашу помощь! –

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