Better way to filter a data frame with dplyr using OR?

dataframe, dplyr, r

Solution

I'm not sure whether this approach is better. At least you don't have to write the column names:

library(dplyr)
filter(data, rowSums(sapply(data, "%in%", condition)))
#             subject1  subject2
# 1            History Chemistry
# 2            Biology  Religion
# 3 Digital Humanities  Religion

Problem

I have a data frame in R with columns `subject1` and `subject2` (which contain Library of Congress subject headings). I'd like to filter the data frame by testing whether the subjects match an approved list. Say, for example, that I have this data frame. ``` data <- data.frame( subject1 = c("History", "Biology", "Physics", "Digital Humanities"), subject2 = c("Chemistry", "Religion", "Chemistry", "Religion") ) ``` And suppose this is the list of approved subjects. ``` condition <- c("History", "Religion") ``` What I want to do is filter by either subject1 or subject2: ``` subset <- filter(data, subject1 %in% condition | subject2 %in% condition) ``` That returns items 1, 2, and 4 from the original data frame, as desired. Is that the best way to filter by multiple fields using or rather than and logic? It seems like there must be a better, more idiomatic way, but I don't know what it is. Maybe a more generic way to ask the question is to say, if I combine subject1 and subject2, is there a way of testing if any value in one vector matches any value in another vector. I'd like to write something like: ``` subset <- filter(data, c(subject1, subject2) %in% condition) ```

Original source