使用OR来使用dplyr过滤数据帧的更好方法是什么?

Lin*_*len 21 r dataframe dplyr

我在R中有一个带有列的数据框subject1subject2(包含国会图书馆主题标题).我想通过测试主题是否与批准的列表匹配来过滤数据框.比方说,我有这个数据框.

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

并且假设这是经批准的科目列表.

condition <- c("History", "Religion")
Run Code Online (Sandbox Code Playgroud)

我想要做的是按subject1或subject2过滤:

subset <- filter(data, subject1 %in% condition | subject2 %in% condition)
Run Code Online (Sandbox Code Playgroud)

根据需要,它从原始数据帧返回项目1,2和4.

那是最好的方式来通过多个字段使用过滤而不是逻辑是什么?似乎必须有更好,更惯用的方式,但我不知道它是什么.

也许更通用的方式来问这个问题就是说,如果我将subject1和subject2结合起来,有没有办法测试一个向量中的任何值是否与另一个向量中的任何值匹配.我想写一些类似的东西:

subset <- filter(data, c(subject1, subject2) %in% condition)
Run Code Online (Sandbox Code Playgroud)

Sve*_*ein 14

我不确定这种方法是否更好.至少你不必写列名:

library(dplyr)
filter(data, rowSums(sapply(data, "%in%", condition)))
#             subject1  subject2
# 1            History Chemistry
# 2            Biology  Religion
# 3 Digital Humanities  Religion
Run Code Online (Sandbox Code Playgroud)

  • `Reduce('|',lapply(数据,'%in%',条件))`会快得多 (3认同)