Есть ли функция для фильтрации строк, которая содержит строку, но для выбранных имен столбцов, которая содержит данную строку в R? - PullRequest
1 голос
/ 18 февраля 2020

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

outl <- c("God","Devil","Priest")

Теперь давайте предположим, что это мой df:

ID <- c(1,2,3,4)
Actor1<- c("Driver","","","")
Actor2<- c("President","Zombie","","")
Actor3<- c("CEO","Devil","","")
Actor4<-c("Priest","","Killer","Mayor")
Leng<- c(12,42,42,22)
Genre<-c("horror","criminal","drama","comedy")
df_ex <-data.frame(ID, Actor1, Actor2, Actor3, Actor4, Leng, Genre)

Я хотел бы отфильтровать идентификаторы строк, которые содержат имена из выброса в ЛЮБОМ столбце, который имеет имя «Actor» (их может быть 100, поэтому я не могу сделать это с помощью оператора OR), поэтому что-то вроде:

df_ex %>%
  filter(*anycolumn that contains string "Actor"* %in% outl)

, и я ожидаю получить строки с идентификаторами 1 и 2

надеюсь, это достаточно ясно, заранее спасибо

Ответы [ 2 ]

5 голосов
/ 18 февраля 2020

Вы можете использовать filter_at для специальной фильтрации на основе указанных c выбранных переменных (в данном случае те, которые начинаются с "Actor").

library(tidyverse)

df_ex %>%
  filter_at(vars(starts_with("Actor")), any_vars(. %in% outl))

Вывод

  ID Actor1    Actor2 Actor3 Actor4 Leng    Genre
1  1 Driver President    CEO Priest   12   horror
2  2           Zombie  Devil          42 criminal
0 голосов
/ 18 февраля 2020

В base R мы можем сделать

df_ex[Reduce(`|`, lapply(df_ex[startsWith(names(df_ex), "Actor")], `%in%`, outl)), ]
#   ID Actor1    Actor2 Actor3 Actor4 Leng    Genre
#1  1 Driver President    CEO Priest   12   horror
#2  2           Zombie  Devil          42 criminal
...