【问题标题】:Better way to filter a data frame with dplyr using OR?使用 OR 使用 dplyr 过滤数据框的更好方法?
【发布时间】: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 有点混乱。

标签: r dataframe dplyr


【解决方案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)) 会快很多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
  • 2016-04-26
  • 2021-02-27
  • 1970-01-01
  • 2019-03-29
相关资源
最近更新 更多