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

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

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

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

【问题讨论】:

    标签: r conditional dataframe


    【解决方案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
    

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

    【讨论】:

    • 这是投票率最高的问题,然后找到:stackoverflow.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,]
    猜你喜欢
    • 2022-06-18
    • 2018-03-08
    • 2022-01-09
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    相关资源
    最近更新 更多