Подтвердить что ты не робот

Лучший способ фильтрации кадра данных с помощью dplyr с помощью OR?

У меня есть кадр данных в R с столбцами subject1 и subject2 (которые содержат заголовки Библиотеки Конгресса). Я хотел бы отфильтровать фрейм данных, проверяя, соответствуют ли темы утвержденному списку. Скажем, например, что у меня есть этот фрейм данных.

data <- data.frame(
  subject1 = c("History", "Biology", "Physics", "Digital Humanities"),
  subject2 = c("Chemistry", "Religion", "Chemistry", "Religion")
)

И пусть это список одобренных тем.

condition <- c("History", "Religion")

Что я хочу сделать, это фильтр либо subject1, либо subject2:

subset <- filter(data, subject1 %in% condition | subject2 %in% condition)

Это возвращает элементы 1, 2 и 4 из исходного кадра данных, если требуется.

Это лучший способ фильтровать по нескольким полям, используя, а не логику? Кажется, должен быть лучший, более идиоматический способ, но я не знаю, что это такое.

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

subset <- filter(data, c(subject1, subject2) %in% condition)
4b9b3361

Ответ 1

Я не уверен, лучше ли этот подход. По крайней мере, вам не нужно писать имена столбцов:

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