我正在尝试使用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
我在做什么错了?
答案 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
中,正在检查每行中的任何列是否没有“条款”,并且是否在所有行中都满足该条件