如何使用“ OR”组合多个条件以子集数据帧?


174

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

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

但是我不知道上面如何使用“ OR”。

Answers:


248
my.data.frame <- subset(data , V1 > 2 | V2 < 4)

模仿此功能的行为并且更适合包含在功能体内的替代解决方案:

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

有人批评which不需要使用,但是这样做确实会阻止NA值返回不必要的结果。上面展示的两个选项的等效项(即,对于V1或V2中的任何NA不返回NA行)which将是:

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

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

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

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


1
这是票数最高的问题,然后找到一个问题: stackoverflow.com/questions/9860090/…–
PatrickT

1
优点是紧凑且易于理解。缺点是在功能构建任务中缺乏实用性。如果要复制它,[则需要包装which或使用其他!is.na约束。
IRTFM

是否需要“哪个”?如果不需要,为什么要使用它?
克莱布(Cleb)2015年

1
它不是“必需”的,但是如果省略,则可能会得到不同的结果which。如果V1和V2均为NA,则如果您将省略,则会在该位置得到一排NA which。我使用的是大型数据集,即使NA的相对较少,也确实会用垃圾输出填满我的屏幕。有人认为这是一个功能。我不。
IRTFM

除了这些条件外,您如何包括对它的调用greplgrep与此相关的调用以对所需的行进行模式匹配?
user5359531
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.