布尔表达式 - 如果 2 个或更多条件为 True

Boolean expression - if 2 or more conditions True

提问人:ab192 提问时间:8/5/2021 最后编辑:j__carlsonab192 更新时间:8/6/2021 访问量:299

问:

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

知道如何在 R 中轻松做到这一点吗?我可以用每个条件组合做一个很长的表达,但希望能有更容易的东西,

非常感谢

编辑:

根据要求进行 Reprex

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

我想要 df 的子集,其中上述两个或多个条件为真

r dplyr 子集 布尔逻辑

评论

1赞 Ronak Shah 8/5/2021
如果您创建一个可重复的小示例以及预期的输出,则会更容易提供帮助。阅读有关如何给出可重复示例的信息。
2赞 j__carlson 8/5/2021
您可以对布尔表达式求和,例如 。然后,您可以创建一个大于或等于 2 的布尔值。t= c(TRUE,FALSE,TRUE); sum(t)sum(t)
0赞 j__carlson 8/5/2021
您需要添加要过滤的集合的样本以及您希望接收的输出。

答:

0赞 andrew_reece 8/5/2021 #1

这是一种方法。你也可以使用,如果你想严格整洁它。dplyrrowwisec_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)

评论

0赞 ab192 8/6/2021
谢谢,我最终发现了 rowwise,虽然我不知道c_across,非常有用
0赞 akrun 8/6/2021 #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