Как узнать количество столбцов, имеющих NA в r? - PullRequest
1 голос
/ 03 марта 2020

У меня есть набор данных, где столбцы больше 1000. Теперь я знаю, что есть много столбцов, в которых все записи имеют NA. Я хочу знать количество столбцов, которые имеют NA. Например, если есть 100 столбцов со значениями NA, я хочу, чтобы выходные данные были равны 100. Я исследовал множество сайтов, чтобы найти ответ, но ничего не помогло. Это то, что я пытался.

colnames(data)[colSums(is.na(data)) > 0]

Но это возвращает мне все столбцы. Но мне нужен только счет.

Ответы [ 4 ]

1 голос
/ 03 марта 2020

Чтобы получить количество столбцов, содержащих NA, вы можете использовать colSums и sum:

sum(colSums(is.na(data)) > 0)

Чтобы получить количество столбцов, содержащих только NA, я бы использовал решение из @ ronak-shah (sum(colSums(!is.na(data)) == 0))

1 голос
/ 03 марта 2020

Попробуйте:

sum(colSums(is.na(data)) == nrow(data))
#[1] 2

Или наоборот

sum(colSums(!is.na(data)) == 0)

Вы также можете использовать Filter

length(Filter(function(x) all(is.na(x)), data))

Или с dplyr :

library(dplyr)
data %>% select_if(~all(is.na(.))) %>% ncol

данные

data <- data.frame(a = c(1, 2, NA, 4), b = NA, c = letters[1:4], d = NA)
1 голос
/ 03 марта 2020

вы можете использовать это, я думаю:

library(DataExplorer)
plot_missing(iris) #this will print all the missing values in the plot 
profile_missing(iris) #this will print all the missing values columns with numbers like this 

Результат на выходе

как только вы получите их во фрейме данных, оставьте столбцы> 0, вы получите список столбцов которые имеют NA.

1 голос
/ 03 марта 2020

База, которую вы можете запустить

sum(sapply(data, function(col) any(is.na(col)))

(которая будет работать, например, для data.frames). sapply возвращает вектор логических значений, например, [1] True False True для data.frame с тремя столбцами с двумя столбцами с отсутствующими значениями в нем. Логические значения преобразуются в 1, которые можно суммировать.


Если data является матрицей, подставьте sapply для применения и выполните

sum(apply(as.matrix(a), 2, function(col) any(is.na(col))))

РЕДАКТИРОВАТЬ Прочитав вопрос ОП еще раз, я понял, что ОП хочет столбцы, в которых столбцы содержат ВСЕ NA. Это может быть получено путем замены any на all, то есть

sum(sapply(data, function(col) all(is.na(col))))
...