web-dev-qa-db-ja.com

ORを使用してdplyrでデータフレームをフィルタリングするより良い方法は?

[〜#〜] 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が返されます。

これは、andロジックではなくorを使用して複数のフィールドでフィルタリングする最良の方法ですか?より良い、より慣用的な方法があるに違いないようですが、それが何かはわかりません。

たぶん、より一般的な質問の仕方は、subject1とsubject2を組み合わせた場合、あるベクトルの値が別のベクトルの値と一致するかどうかをテストする方法があるということです。私は次のようなものを書きたいです:

subset <- filter(data, c(subject1, subject2) %in% condition)
21
Lincoln Mullen

このアプローチの方が良いかどうかはわかりません。少なくとも列名を書く必要はありません:

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