使用 OR 使用 dplyr 过滤数据框的更好方法?

Posted

技术标签:

【中文标题】使用 OR 使用 dplyr 过滤数据框的更好方法?【英文标题】:Better way to filter a data frame with dplyr using OR? 【发布时间】:2014-03-05 09:34:38 【问题描述】:

我在 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 而不是 and 逻辑按多个字段过滤的最佳方法吗?似乎必须有更好、更惯用的方式,但我不知道它是什么。

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

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

【问题讨论】:

您的代码 (filter(data, subject1 %in% condition | subject2 %in% condition)) 适合我 它也适用于我。我想知道是否有更好的方法。 感谢您编辑帖子以进行澄清。 确实,should return 有点混乱。 【参考方案1】:

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

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

【讨论】:

Reduce('|', lapply(data, '%in%', condition)) 会快很多

以上是关于使用 OR 使用 dplyr 过滤数据框的更好方法?的主要内容,如果未能解决你的问题,请参考以下文章

在R中,如何使用dplyr按数据类型过滤数据帧?

使用过滤器/变异和 dplyr/tidyverse 逻辑对数据库进行分类[重复]

使用dplyr在R中的所有列上应用iqr过滤器

在 R 中使用 dplyr 进行过滤时,为啥过滤掉的变量级别会保留在过滤后的数据中? [复制]

使用 dplyr 过滤 postgreSQL 数据库中的多个值

在 dplyr 中按组过滤多个条件的条件 IF