【问题标题】:Boolean expression - if 2 or more conditions True布尔表达式 - 如果 2 个或更多条件为真
【发布时间】:2021-10-10 10:34:24
【问题描述】:

我正在尝试根据某些条件创建一个 dplyr 过滤器,比如说有三个条件,条件 1、条件 2 和条件 3。 如果任何两个或更多条件为真,我希望它总体评估为真,

知道如何在 R 中轻松做到这一点吗?我可以用每种条件组合做一个很长的表达式,但希望更简单,

非常感谢

编辑:

按要求表示

df %>%
filter(condition1|condition2|condition2)

我想要满足上述两个或更多条件的 df 子集

【问题讨论】:

  • 如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example
  • 您可以对布尔表达式求和,例如t= c(TRUE,FALSE,TRUE); sum(t)。然后您可以创建一个布尔值,其中 sum(t) 大于或等于 2。
  • 您需要添加您正在过滤的集合的样本以及您希望接收的输出。

标签: r dplyr subset boolean-logic


【解决方案1】:

这是dplyr 方法。如果您想严格地保持整洁,也可以使用rowwisec_across

library(dplyr)

df <- tibble(a = c(T, T, F), b = c(F, T, T), c = c(T, F, F))

df
# A tibble: 3 x 4
  a     b     c     truth_ct
  <lgl> <lgl> <lgl>    <dbl>
1 TRUE  FALSE TRUE         2
2 TRUE  TRUE  FALSE        2
3 FALSE TRUE  FALSE        1
df %>% 
  mutate(truth_ct = rowSums(.)) %>% 
  filter(truth_ct >= 2)

# A tibble: 2 x 4
  a     b     c     truth_ct
  <lgl> <lgl> <lgl>    <dbl>
1 TRUE  FALSE TRUE         2
2 TRUE  TRUE  FALSE        2

rowwise 方法:

df %>% 
  rowwise() %>% 
  mutate(truth_ct = sum(c_across(a:c))) %>% 
  filter(truth_ct >= 2)

【讨论】:

  • 谢谢我终于知道了 rowwise,不过我不知道 c_across,非常有用
【解决方案2】:

使用reduce

library(dplyr)
library(purrr)
df %>% 
   filter(reduce(cur_data(), `+`) >=2)
# A tibble: 2 x 3
  a     b     c    
  <lgl> <lgl> <lgl>
1 TRUE  FALSE TRUE 
2 TRUE  TRUE  FALSE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 2018-03-29
    • 1970-01-01
    相关资源
    最近更新 更多