Как получить ТОЛЬКО столбцы со значениями NA и количеством NA - PullRequest
1 голос
/ 22 сентября 2019

У меня есть набор данных, и некоторые столбцы имеют значения NA.Мне нужно отображать только имена столбцов, которые имеют значения NA, а также общее количество значений NA в каждом из этих столбцов.Я смог заставить работать разные части проблемы, но не обе сразу.

Это дает мне только имена столбцов столбцов, содержащих значения NA.Но я хочу, чтобы итоги NA отображались под каждым именем столбца.

nacol<- colnames(df)[colSums(is.na(df)) > 0]

Это дает мне именно то, что я хочу, но также отображает нулевые итоги других столбцов в кадре данных, и я не хочу, чтобы оничтобы быть отображенным.

df %>% summarise_all(funs(sum(is.na(.))))

Я, очевидно, полный новичок.Я понимаю, что эту проблему очень легко решить, но я пытался часами, и я просто разочарован.Пожалуйста помоги.Спасибо!

Ответы [ 3 ]

1 голос
/ 22 сентября 2019

Возможная альтернатива, используя purrr и dplyr для трубы (используя airquality для воспроизведения):

library(dplyr)
library(purrr)

airquality %>% 
  keep(~anyNA(.x)) %>% 
   map_dbl(~sum(is.na(.x)))
  Ozone Solar.R 
     37       7 

Используя данные из ответа @Ronak Shah:

 df %>% 
  keep(~anyNA(.x)) %>% 
   map_dbl(~sum(is.na(.x)))
a c 
2 1 

Использование data.table (может быть способ сделать его более компактным):

setDT(df)
 df[,Filter(anyNA,.SD)][,lapply(.SD, function(x) sum(is.na(x)))]
   a c
1: 2 1

Данные:

df <- structure(list(a = c(2, 3, NA, NA, 1), b = 1:5, c = c(1, 3, 4, 
NA, 1)), class = "data.frame", row.names = c(NA, -5L))

airquality is builtin
1 голос
/ 22 сентября 2019

Мы можем сделать

na.omit(na_if(colSums(is.na(df)), 0))
# a c 
# 2 1 

Или используя summarise_if

library(dplyr)
df %>%
    summarise_if(~ any(is.na(.)), ~sum(is.na(.)))
#  a c
#1 2 1

данные

df <- data.frame(a = c(2, 3, NA, NA, 1), b = 1:5, c = c(1, 3, 4, NA, 1))
1 голос
/ 22 сентября 2019

Мы можем использовать Filter с colSums, чтобы удалить 0 значений

Filter(function(x) x > 0, colSums(is.na(df)))
#a c 
#2 1

Или select_if в dplyr

library(dplyr)
df %>% 
  summarise_all(~(sum(is.na(.)))) %>%
  select_if(. > 0)

Мы также можем сначалавыберите столбец со значениями any NA и затем подсчитайте их.

df %>%
  select_if(~any(is.na(.))) %>%
  summarise_all(~(sum(is.na(.))))

данные

df <- data.frame(a = c(2, 3, NA, NA, 1), b = 1:5, c = c(1, 3, 4, NA, 1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...