【问题标题】:Using any with dplyr将任何与 dplyr 一起使用
【发布时间】:2021-09-07 22:18:26
【问题描述】:

如何在 dplyr 管道中使用 any ?

例如使用 mydata ,我想提取至少有一个 TRUE 的行。

mydata = data.frame(V1=c(FALSE,NA,FALSE,TRUE),
                    V2 = c(NA,TRUE,FALSE,TRUE),
                    V3 = c(FALSE,FALSE,FALSE,TRUE))

mydata

     V1    V2    V3
1 FALSE    NA FALSE
2    NA  TRUE FALSE
3 FALSE FALSE FALSE
4  TRUE  TRUE  TRUE

【问题讨论】:

  • subset(mydata, rowSums(mydata, na.rm = T) >0)
  • @AnilGoyal 感谢您的评论,我的数据框中还有其他变量以上只是一个可重复的示例
  • 所以在 rowsums 中使用 mydata[1:3]
  • 也许问题可以更好地表述为“如何使用 dplyr 跨列使用any?”或类似的东西。

标签: r dplyr filtering any


【解决方案1】:

如果使用any,我认为您需要使用rowwisec_across,但正如@akrun 所指出的,函数if_any 很好地结合了这些元素。

library(dplyr, warn.conflicts = FALSE)

mydata <- data.frame(
    V1 = c(FALSE, NA, FALSE, TRUE),
    V2 = c(NA, TRUE, FALSE, TRUE),
    V3 = c(FALSE, FALSE, FALSE, TRUE))

mydata %>%
    rowwise() %>%
    filter(any(c_across(starts_with("V")))) %>%
    ungroup()
#> # A tibble: 2 x 3
#>   V1    V2    V3   
#>   <lgl> <lgl> <lgl>
#> 1 NA    TRUE  FALSE
#> 2 TRUE  TRUE  TRUE

mydata %>% 
    filter(if_any(starts_with("V")))
#>     V1   V2    V3
#> 1   NA TRUE FALSE
#> 2 TRUE TRUE  TRUE

reprex package (v2.0.0) 于 2021 年 6 月 25 日创建

【讨论】:

    【解决方案2】:

    我们可以以矢量化的方式使用if_any

    library(dplyr)
    mydata %>% 
      filter(if_any(starts_with('V')))
        V1   V2    V3
    1   NA TRUE FALSE
    2 TRUE TRUE  TRUE
    

    【讨论】:

      【解决方案3】:

      作为您问题的具体解决方案,请尝试以下操作。

      x <- mydata %>% filter(V1 | V2 | V3)
      
      

      【讨论】:

      • 编辑问题:无需比较逻辑:filter(V1) 而不是filter(V1 == TRUE)
      猜你喜欢
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      • 2015-03-16
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多