Иногда я хочу просмотреть все строки во фрейме данных, которые будут удалены, если я удалю все строки, в которых отсутствует значение какой-либо переменной. В данном случае меня особенно интересует, как это сделать с помощью функции dplyr1.0, across()используемой внутри filter()глагола.
Вот пример фрейма данных:
df <- tribble(
~id, ~x, ~y,
1, 1, 0,
2, 1, 1,
3, NA, 1,
4, 0, 0,
5, 1, NA
)
Код для хранения строк, которые НЕ содержат пропущенных значений, представлен на веб- сайте tidyverse. В частности, я могу использовать:
df %>%
filter(
across(
.cols = everything(),
.fns = ~!is.na(.x)
)
)
Что возвращает:
# A tibble: 3 x 3
id x y
<dbl> <dbl> <dbl>
1 1 1 0
2 2 1 1
3 4 0 0
Однако я не могу понять, как вернуть обратное — строки с отсутствующим значением в любой переменной. Результат, который я ищу:
# A tibble: 2 x 3
id x y
<dbl> <dbl> <dbl>
1 3 NA 1
2 5 1 NA
Моей первой мыслью было просто удалить !:
df %>%
filter(
across(
.cols = everything(),
.fns = ~ is.na(.x)
)
)
Но это возвращает нулевые строки.
Конечно, я могу получить ответ, который хочу, с помощью этого кода, если я заранее знаю все переменные, которые имеют пропущенное значение:
df %>%
filter(is.na(x) | is.na(y))
Но я ищу решение, которое не требует, чтобы я заранее знал, какие переменные имеют пропущенное значение. Кроме того, я знаю, как это сделать с помощью filter_all()функции:
df %>%
filter_all(any_vars(is.na(.)))
Но эта filter_all()функция была заменена использованием across()в существующем глаголе. Видетьhttps://dplyr.tidyverse.org/articles/colwise.html
Другие неудачные попытки, которые я сделал:
df %>%
filter(
across(
.cols = everything(),
.fns = ~any_vars(is.na(.x))
)
)
df %>%
filter(
across(
.cols = everything(),
.fns = ~!!any_vars(is.na(.x))
)
)
df %>%
filter(
across(
.cols = everything(),
.fns = ~!!any_vars(is.na(.))
)
)
df %>%
filter(
across(
.cols = everything(),
.fns = ~any(is.na(.x))
)
)
df %>%
filter(
across(
.cols = everything(),
.fns = ~any(is.na(.))
)
)
Решение проблемы
Теперь это возможно с dplyr1.0.4. Новые if_any()замены across()для варианта использования фильтрации.
library(dplyr)
df <- tribble(~ id, ~ x, ~ y,
1, 1, 0,
2, 1, 1,
3, NA, 1,
4, 0, 0,
5, 1, NA)
df %>%
filter(if_any(everything(), is.na))
#> # A tibble: 2 x 3
#> id x y
#> <dbl> <dbl> <dbl>
#> 1 3 NA 1
#> 2 5 1 NA
Создано 10 февраля 2021 г. пакетом reprex (v0.3.0)
Подробнее см. здесь: https://www.tidyverse.org/blog/2021/02/dplyr-1-0-4-if-any/
Комментариев нет:
Отправить комментарий