Фильтрация на основе подходящих шаблонов строк - PullRequest
2 голосов
/ 27 сентября 2019

У меня есть набор данных, который выглядит следующим образом:

df <- data.frame("id" = c("Alpha", "Beta", "Gamma","Alpha","Beta","Gamma","Lambda","Tau"), 
                 "group" = c("Alpha is good", "Alpha is good", "Alpha is good", "Beta is bad", "Beta is bad","Beta is bad","Beta is bad","Beta is bad"), 
                 "Val" = c(2,2,2,5,5,5,5,5))

Я хотел бы отфильтровать наблюдения, когда имя группы совпадает с именем идентификатора.В итоге, окончательный набор данных должен выглядеть следующим образом:

final <- data.frame("id" = c("Alpha", "Beta"), 
                 "group" = c("Alpha is good", "Beta is bad"), 
                 "Val" = c(2,5))

Идея состоит в том, что функция должна быть способна распознавать, если строка в "id" также присутствует в "group".

Надеюсь, это понятно

Заранее спасибо за помощь

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Мы можем использовать str_detect, который векторизован (Согласно ?str_detect

Векторизация по строке и шаблону.

library(stringr)
library(dplyr(
df %>%
  mutate_if(is.factor, as.character) %>%
  filter(str_detect(group, id))

Если естьперекрывающиеся элементы в каждой группе

df %>%
  mutate_if(is.factor, as.character) %>%
  group_by(group1 = group) %>%
  filter(str_detect(group, id))
0 голосов
/ 27 сентября 2019

Одна base R возможность может быть:

df[unlist(Map(grepl, df$id, df$group)), ]

     id         group Val
1 Alpha Alpha is good   2
5  Beta   Beta is bad   5

Или даже более элегантно, используя mapply() (на основе комментария от @ r2evans):

df[mapply(grepl, df$id, df$group), ]

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

df <- data.frame("id" = c("Alpha", "Beta", "Gamma","Alpha","Beta","Gamma","Lambda","Tau"), 
                 "group" = c("Alpha is good", "Alpha is good", "Alpha is good", "Beta is bad", "Beta is bad","Beta is bad","Beta is bad","Beta is bad"), 
                 "Val" = c(2,2,2,5,5,5,5,5),
                 stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...