21

我在R中有一个数据框,其中包含列subject1subject2(其中包含国会图书馆主题标题)。我想通过测试主题是否与批准的列表匹配来过滤数据框。例如,假设我有这个数据框。

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

并假设这是批准的主题列表。

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

我想要做的是按主题1或主题2过滤:

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

这会根据需要从原始数据框中返回项目 1、2 和 4。

这是使用or而不是逻辑按多个字段过滤的最佳方法吗?似乎必须有更好,更惯用的方式,但我不知道它是什么。

也许更通用的提问方式是说,如果我将主题 1 和主题 2 结合起来,是否有一种方法可以测试一个向量中的任何值是否与另一个向量中的任何值匹配。我想写一些类似的东西:

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 回答