2011-02-08 60 views
123

我在R中有一个data.frame我想在两个不同的列上尝试两个不同的条件,但我希望这些条件是包容性的。因此,我想用“或”来结合条件。当我想要使用“AND”条件时,我已经使用了以下语法并取得了很大的成功。如何使用“OR”将多个条件组合成一个数据框子集?

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

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

+161

与其对这样的“基本”问题变得焦头烂额,不如将它们视为让互联网更好的机会。 SO的谷歌果汁很强劲,每当SO问题从2004年开始取代可怕的列表问题时,天使就会获得它的翅膀。 – Andrew 2012-06-04 16:19:28

+0

我认为贬低listserv问题对寻求学习如何搜索的人是一种伤害。人们应该考虑使用一个好的搜索引擎来处理特定的问题我的选择是http://markmail.org/search/?q=list%3Aorg.r-project,但其他人可能会选择Rseek.org。 – 2016-09-01 19:11:17

+6

我认为诋毁listserv问题的诋毁言论对于那些试图阅读非贬低评论的人是不利的 – hedgedandlevered 2016-11-15 06:32:49

回答

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

模仿此功能的行为,并会更适合于函数体内包含一个可选的方案:

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

有的人批评使用which不需要,但它确实会阻止NA值抛出不想要的结果。等效(.IE没有返回NA-行任何NA在V1或V2)以上证明没有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 

秩序的论据可以使用'&”当物质。

8

只是为了完整起见,我们可以使用运营商[[[

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 $名称为equivalent to DF [[ “姓名”,确切= 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 
相关问题