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

Sam*_*Sam 168 conditional r dataframe

我在R中有一个data.frame.我想在两个不同的列上尝试两种不同的条件,但我希望这些条件具有包容性.因此,我想用"OR"来结合条件.当我想使用"AND"条件时,我已经使用了以下语法,并取得了很多成功.

my.data.frame <- data[(data$V1 > 2) & (data$V2 < 4), ]
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在上面使用'OR'.

42-*_*42- 235

my.data.frame <- subset(data , V1 > 2 | V2 < 4)
Run Code Online (Sandbox Code Playgroud)

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

new.data <- data[ which( data$V1 > 2 | data$V2 < 4) , ]
Run Code Online (Sandbox Code Playgroud)

有些人批评使用which不需要的东西,但确实可以防止NA价值回落不必要的结果.对于上面演示的两个选项,等效(.ie不返回V1或V2中任何NA的NA行)which将是:

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

注意:我要感谢匿名贡献者尝试修复上面代码中的错误,这是一个被主持人拒绝的修复程序.当我纠正第一个时,我注意到了一个额外的错误.如果要按照我的意图处理,则检查NA值的条件子句必须是第一个,因为......

> NA & 1
[1] NA
> 0 & NA
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

使用"&"时,参数顺序可能很重要.


小智 28

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

my.data.frame <- data[(data$V1 > 2) | (data$V2 < 4), ]
Run Code Online (Sandbox Code Playgroud)


mpa*_*nco 15

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

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

几个选项

df[df[1] < 0.5 | df[2] == "g", ] 
df[df[[1]] < 0.5 | df[[2]] == "g", ] 
df[df["v1"] < 0.5 | df["v2"] == "g", ]
Run Code Online (Sandbox Code Playgroud)

df $ name 相当于 df [["name",exact = FALSE]]

使用dplyr:

library(dplyr)
filter(df, v1 < 0.5 | v2 == "g")
Run Code Online (Sandbox Code Playgroud)

使用sqldf:

library(sqldf)
sqldf('SELECT *
      FROM df 
      WHERE v1 < 0.5 OR v2 = "g"')
Run Code Online (Sandbox Code Playgroud)

以上选项的输出:

          v1 v2
1 0.26550866  a
2 0.37212390  b
3 0.20168193  e
4 0.94467527  g
5 0.06178627  j
Run Code Online (Sandbox Code Playgroud)