Подсчет не NA в кадре данных; получать ответ как вектор - PullRequest
23 голосов
/ 13 февраля 2011

Скажите, что у меня есть следующий R data.frame ZZZ:

( ZZZ <- structure(list(n = c(1, 2, NA), m = c(6, NA, NA), o = c(7, 8, 
8)), .Names = c("n", "m", "o"), row.names = c(NA, -3L), class = "data.frame") )

## not run
   n  m o
1  1  6 7
2  2 NA 8
3 NA NA 8

Я хочу знать, в виде вектора, сколько у меня не-АН. Я хочу, чтобы ответ был доступен для меня как:

2, 1, 3

Когда я использую команду length(ZZZ), я получаю 3, что, конечно, является числом векторов в data.frame , достаточно ценной информацией.

У меня есть другие функции, которые работают с этим data.frame и дают мне ответы в виде векторов, но, черт возьми, длина работает не так.

Ответы [ 4 ]

71 голосов
/ 13 февраля 2011
colSums(!is.na(x))

Векторизация ftw.

30 голосов
/ 13 февраля 2011

Попробуйте:

# define "demo" dataset
ZZZ <- data.frame(n=c(1,2,NA),m=c(6,NA,NA),o=c(7,8,8))
# apply the counting function per columns
apply(ZZZ, 2, function(x) length(which(!is.na(x))))

Выполнив:

> apply(ZZZ, 2, function(x) length(which(!is.na(x))))
n m o 
2 1 3 

Если вы действительно настаиваете на возвращении вектора, вы можете использовать as.vector, например, определив эту функцию:

nonNAs <- function(x) {
    as.vector(apply(x, 2, function(x) length(which(!is.na(x)))))
    }

Вы можете просто запустить nonNAs(ZZZ):

> nonNAs(ZZZ)
[1] 2 1 3
6 голосов
/ 09 июня 2014

Для получения общего количества пропущенных значений используйте сумму (is.na (x)), а для столбцов - colSums (is.na (x)), где x - переменная, содержащая набор данных

1 голос
/ 13 февраля 2011

Если вам нужна только общая сумма NA, то sum () с помощью! Is.na () сделает это:

ZZZ <- data.frame(n = c(1, 2, NA), m = c(6, NA, NA), o = c(7, 8, 8))
sum(!is.na(ZZZ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...