GOOGLE ADS

вторник, 26 апреля 2022 г.

Использование filter() с cross() для сохранения всех строк фрейма данных, которые содержат отсутствующее значение для любой переменной.

Иногда я хочу просмотреть все строки во фрейме данных, которые будут удалены, если я удалю все строки, в которых отсутствует значение какой-либо переменной. В данном случае меня особенно интересует, как это сделать с помощью функции 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/

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

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...