filter_at 在过滤任何不符合条件的变量时不起作用

filter_at does not work when filtering for any variable that does NOT meet a criteria

我正在尝试使用 dplyr 的 filter_at 来过滤掉任何在任何时候被终止的人。但是,它一直给我错误的答案。

这是一个示例数据集:

problem <- tibble(name = c("Sally", "Frank", "Joe"),
                  status1 = c("On Staff", "On Staff", "On Staff"),
                  status2 = c("On Staff", "Term", "On Staff"),
                  status3 = c("On Staff", "Term", "Term"),
                  status4 = c("Promoted", "Rehired", "Term"))

如您所见,我有很多以 status 开头的变量,所以我尝试了 filter_at 所有包含 status 的变量:

problem %>%
filter_at(vars(contains("status")), any_vars(. != "Term))

不幸的是,它产生了这个无用的结果:

# A tibble: 3 x 5
  name  status1  status2  status3  status4 
  <chr> <chr>    <chr>    <chr>    <chr>   
1 Sally On Staff On Staff On Staff Promoted
2 Frank On Staff Term     Term     Rehired 
3 Joe   On Staff On Staff Term     Term

相反,我希望最终产品看起来像这样:

# A tibble: 1 x 5
  name  status1  status2  status3  status4 
  <chr> <chr>    <chr>    <chr>    <chr>   
1 Sally On Staff On Staff On Staff Promoted

我做错了什么?

我们可以用all_vars代替any_vars,条件相同。它检查一行中的每一列是否没有 'Term' 元素,如果所有列都没有,则 return 该行

problem %>%
   filter_at(vars(contains("status")), all_vars(. != "Term"))
# A tibble: 1 x 5
#  name  status1  status2  status3  status4 
#  <chr> <chr>    <chr>    <chr>    <chr>   
#1 Sally On Staff On Staff On Staff Promoted

在 OP 的代码中,any_vars 正在检查每行中的任何列是否没有 "Term" 并且在所有行中都满足