[〜#〜] 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)
このアプローチの方が良いかどうかはわかりません。少なくとも列名を書く必要はありません:
library(dplyr)
filter(data, rowSums(sapply(data, "%in%", condition)))
# subject1 subject2
# 1 History Chemistry
# 2 Biology Religion
# 3 Digital Humanities Religion