filter_all for !is.na () в R по-прежнему выдает недостающие значения

#r #filter #dplyr #filtering #na

#r #Фильтр #dplyr #фильтрация #na

Вопрос:

Я пытаюсь использовать filter_all() от dplyr для получения всех строк, в которых нет отсутствующих данных. Я использую dplyr, встроенный в набор данных starwars. Когда я использую этот код для получения результата, в котором есть какие-либо пропущенные значения, он работает без проблем:

  library(dplyr)
 data("starwars")

rows_with_NAs <- starwars %>%
  filter_all(any_vars(is.na(.)))
  

Однако, если я попытаюсь найти строки, в которых нет пропущенных значений с помощью этого кода:

 rows_without_NAs <- starwars %>%
  filter_all(any_vars(!is.na(.)))
  

Я все еще получаю строки с NAs.

 head(rows_without_NAs)
  

Почему это и как я могу это исправить?

Спасибо!

Комментарии:

1. Вы ищете любую переменную, которая имела бы не пропущенное значение. Я думаю, вы хотите переместить отрицание наружу — !any_vars(is.na(.))

2. @thelatemail, когда я пытаюсь это сделать, я получаю следующее сообщение об ошибке: Ошибка в is_quosure(e2) : аргумент «e2» отсутствует, значение по умолчанию отсутствует. Если вы сможете заставить это работать, не могли бы вы прислать мне свой синтаксис? Спасибо!

Ответ №1:

tidyr для этого есть drop_na() оператор.

 library(tidyverse)

data("starwars")

rows_without_NAs <- starwars %>%
    drop_na()
  

Комментарии:

1. Я не знал об этой функции! Одна небольшая поправка для тех, кто в будущем будет искать это решение, заключается в том, что drop_na() находится в tidyr, а не dplyr, но работает все равно. Спасибо, @Simon Woodward!

2. Одна из особенностей программирования в наши дни заключается в том, что существует так много библиотек, что, вероятно, есть что-то, что позволяет делать то, что вы хотите, но часто это действительно трудно найти.