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

时间:2019-06-07 15:55:17

标签: r dplyr data-management

我正在尝试使用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开头的变量,因此我尝试在所有包含status的变量中使用filter_at:

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

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

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

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中,正在检查每行中的任何列是否没有“条款”,并且是否在所有行中都满足该条件