filter_at не работает при фильтрации для любой переменной, которая НЕ соответствует критерию - PullRequest
1 голос
/ 07 июня 2019

Я пытаюсь использовать 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"))

Как видите, у меня много переменных, которые начинаются со статуса, поэтому я пробовал 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 Ответ

2 голосов
/ 07 июня 2019

Мы можем использовать all_vars вместо any_vars здесь с тем же условием.Он проверяет для каждого из столбцов в строке, что у него нет элемента «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

в операторекод any_vars проверяет, не имеет ли какой-либо из столбцов в каждой строке «Term», и удовлетворяется ли он во всех строках

...