21

Rに列subject1subject2(米国議会図書館の件名見出しを含む)を持つデータ フレームがあります。サブジェクトが承認済みリストに一致するかどうかをテストして、データ フレームをフィルタリングしたいと思います。たとえば、このデータ フレームがあるとします。

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)
4

1 に答える 1

14

このアプローチが優れているかどうかはわかりません。少なくとも、列名を記述する必要はありません。

library(dplyr)
filter(data, rowSums(sapply(data, "%in%", condition)))
#             subject1  subject2
# 1            History Chemistry
# 2            Biology  Religion
# 3 Digital Humanities  Religion
于 2014-02-07T20:51:19.653 に答える