Выберите столбец с наименьшими значениями NA - PullRequest
0 голосов
/ 23 мая 2018

Я работаю с фреймом данных, который создает два выходных столбца.Один столбец всегда имеет больше значений NA, чем другой столбец, но никак не предсказуемо.вот мой вопрос, как я могу использовать dplyr, чтобы выбрать столбец с наименьшим количеством значений NA.Я думал об использовании which.min, чтобы решить, но не уверен, как все это собрать.Обратите внимание, что оба столбца содержат значения n, и я хочу выбрать столбец с наименьшим из этих значений.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 мая 2018
library(dplyr)

df <- tibble(a = c(rep(c(NA, 1:5), 4)),      # df with different NA counts/col
             b = c(rep(c(NA, NA, 2:5), 4)))



df %>% 
  summarise_all(funs(sum(is.na(.))))         # NA counts
#> # A tibble: 1 x 2
#>       a     b
#>   <int> <int>
#> 1     4     8

df %>%                                       # answer
  select_if(funs(which.min(sum(is.na(.)))))
#> # A tibble: 24 x 1
#>        a
#>    <int>
#>  1    NA
#>  2     1
#>  3     2
#>  4     3
#>  5     4
#>  6     5
#>  7    NA
#>  8     1
#>  9     2
#> 10     3
#> # ... with 14 more rows

Создано в 2018-05-25 пакетом Представ (v0.2.0).

0 голосов
/ 25 мая 2018

Вы можете сделать это с dplyr и purrr.

внутри which.min. Сначала вы вычисляете количество NA в столбцах с map (может быть столько столбцов, сколько у вас вyour data.frame. Часть keep возвращает только те столбцы, которые на самом деле имеют NA. which.min возвращает именованный вектор, имя которого мы берем, и передаем его функции select dplyr.

Я немного обрисовал код, чтобы вы могли легко увидеть, какие части принадлежат, где.

library(purrr)
library(dplyr)


df %>% select(names(which.min(df %>% 
                                map(function(x) sum(is.na(x))) %>% 
                                keep(~ .x > 0)
                             )
                    )
              )
...