我在 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)
答案 0 :(得分:14)
我不确定这种方法是否更好。至少你不必编写列名:
library(dplyr)
filter(data, rowSums(sapply(data, "%in%", condition)))
# subject1 subject2
# 1 History Chemistry
# 2 Biology Religion
# 3 Digital Humanities Religion