使用 `dplyr::filter_at` 函数来使用多个谓词表达式进行筛选。

3
考虑以下的 tibble 表格。
 # A tibble: 5 x 3
 g1    g2     a
 <dbl> <dbl> <int>
  1     1     1     1
  2     1    NA     2
  3     2     1     3
  4     2     2     4
  5     2     2     5

如果且仅如果(a)g1 == 1g2 == 1,并且(b)g1g2不是缺失值,则我希望保留行。我可以使用filter_atall_vars来实现此目的。请参见下文。

df <- tibble(
  g1 = c(1, 1, 2, 2, 2),
  g2 = c(1, NA, 1, 2, 2),
  a = c(1 : 5)
)
df %>% filter_at(vars(starts_with("g")), all_vars(. == 1)) %>%
    filter_at(vars(starts_with("g")), all_vars(!is.na(.)))

我的问题是如何将上面的两行filter_at合并成以下形式:

df %>% filter_at(vars(starts_with("g")), all_vars(. == 1) & all_vars(!is.na(.)))

看起来all_vars或者any_vars只能接受一个表达式。


1
根据我对文档的阅读,你应该能够在all_vars中使用&all_vars(. == 1 & !is.na(.)) - aosmith
@aomith,你能把这个加入回答中吗? - Ronak Shah
1个回答

2
您可以在all_vars()中使用&来使用多个条件。
df %>%
     filter_at(vars(starts_with("g")), all_vars(. == 1 & !is.na(.) ) )

# A tibble: 1 x 3
     g1    g2     a
  <dbl> <dbl> <int>
1     1     1     1

我认为这个方法可行,因为你想要测试每个列值时都是true的相同条件,即既==1又不是NA。我尝试在类似的问题上使用了这个结构——查找任何一个值为“A”或“B”的行,并发现我可以链接两个过滤器:filter_all(any_vars(str_detect(., "A"))) %>% filter_all(any_vars(str_detect(., "B")))但不能用这种方式:filter_all(any_vars(str_detect(., "A") & str_detect(., "B"))) - Dannid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接