如何使用“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 也会用垃圾输出填满我的屏幕。有些人认为这是一个特点。我没有。
除了这些条件之外,您如何包含对 grepl
或 grep
的调用以同时对所需行进行模式匹配?【参考方案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), ]
【讨论】:
这对于NA
s 在数据框中的存在并不可靠:vc <- 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 < 4,]; vc[vc$cinsiyet == "E" & vc$Not < 2,]
以上是关于如何使用“OR”组合多个条件以对数据框进行子集化?的主要内容,如果未能解决你的问题,请参考以下文章