如何使用“OR”组合多个条件以对数据框进行子集化?

Posted

技术标签:

【中文标题】如何使用“OR”组合多个条件以对数据框进行子集化?【英文标题】:How to combine multiple conditions to subset a data-frame using "OR"? 【发布时间】:2011-06-23 13:22:31 【问题描述】:

我在 R 中有一个 data.frame。我想在两个不同的列上尝试两个不同的条件,但我希望这些条件具有包容性。因此,我想使用“或”来组合条件。当我想使用“AND”条件时,我之前使用过以下语法并取得了很大的成功。

my.data.frame <- data[(data$V1 > 2) & (data$V2 < 4), ]

但我不知道如何在上面使用“或”。

【问题讨论】:

【参考方案1】:
my.data.frame <- subset(data , V1 > 2 | V2 < 4)

模拟此函数的行为并且更适合包含在函数体中的替代解决方案:

new.data <- data[ which( data$V1 > 2 | data$V2 < 4) , ]

有些人批评which 的使用是不必要的,但它确实可以防止NA 值返回不需要的结果。在没有which 的情况下,与上面演示的两个选项等效(即不为 V1 或 V2 中的任何 NA 返回 NA 行)将是:

 new.data <- data[ !is.na(data$V1 | data$V2) & ( data$V1 > 2 | data$V2 < 4)  , ]

注意:我要感谢试图修复上面代码中的错误的匿名贡献者,该修复被版主拒绝。实际上,当我更正第一个错误时,我注意到了另一个错误。如果要按我的意图处理,则需要首先检查 NA 值的条件子句,因为 ...

> NA & 1
[1] NA
> 0 & NA
[1] FALSE

使用 '&" 时,参数的顺序可能很重要。

【讨论】:

这是投票率最高的问题,然后找到:***.com/questions/9860090/… 优点是简洁易懂。缺点是在功能构建任务中缺乏实用性。如果想用[ 复制它,则需要包装which 或使用额外的!is.na 约束。 是否需要'which',如果不需要,为什么要使用它? 这不是“必需的”,但如果您省略 which,您可能会得到不同的结果。如果 V1 和 V2 都是 NA,如果您忽略了 which,您将在该位置获得一行 NA。我使用大型数据集,即使是相对较小比例的 NA 也会用垃圾输出填满我的屏幕。有些人认为这是一个特点。我没有。 除了这些条件之外,您如何包含对 greplgrep 的调用以同时对所需行进行模式匹配?【参考方案2】:

为了完整起见,我们可以使用运算符[[[

set.seed(1)
df <- data.frame(v1 = runif(10), v2 = letters[1:10])

几个选项

df[df[1] < 0.5 | df[2] == "g", ] 
df[df[[1]] < 0.5 | df[[2]] == "g", ] 
df[df["v1"] < 0.5 | df["v2"] == "g", ]

df$name 是 equivalent to df[["name", exact = FALSE]]

使用dplyr

library(dplyr)
filter(df, v1 < 0.5 | v2 == "g")

使用sqldf

library(sqldf)
sqldf('SELECT *
      FROM df 
      WHERE v1 < 0.5 OR v2 = "g"')

上述选项的输出:

          v1 v2
1 0.26550866  a
2 0.37212390  b
3 0.20168193  e
4 0.94467527  g
5 0.06178627  j

【讨论】:

对于 1 个 AND 条件和 3 个 OR 条件,您将如何执行此操作,例如:my.data.frame 10 & ((data$V1 > 2) | (data$V2 哇! sqldf 包太好了。非常方便,尤其是当subset() 有点痛苦时:)【参考方案3】:

您正在寻找“|”。见http://cran.r-project.org/doc/manuals/R-intro.html#Logical-vectors

my.data.frame <- data[(data$V1 > 2) | (data$V2 < 4), ]

【讨论】:

这对于NAs 在数据框中的存在并不可靠:vc &lt;- data.frame(duzey=factor(c("Y","O","Y","D","Y","Y","O"), levels=c("D","O","Y"), ordered=TRUE), cinsiyet=c("E","E","K",NA,"K","E","K"), yas=c(8,3,9,NA,7,NA,6), Not=c(NA,1,1,NA,NA,2,1)); vc; vc[vc$cinsiyet == "E" | vc$Not &lt; 4,]; vc[vc$cinsiyet == "E" &amp; vc$Not &lt; 2,]

以上是关于如何使用“OR”组合多个条件以对数据框进行子集化?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用每组的行数作为条件对数据框进行子集化

如何在条件满足之前用 N 行中的一些对条件行进行子集化,比我的代码更快?

通过要删除的行的多个逻辑条件子集数据帧

对多个数据框进行子集化并聚合它们以有效地进行绘图

如何根据应用于大量列的“不等于”标准对数据框进行子集化?

如何使用for循环或条件在pandas数据框的子集中创建多个回归模型(statsmodel)?