Compter les non NAs dans une trame de données; obtenir une réponse en tant que vecteur

Dites que j'ai les données R suivantes.cadre 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

Je veux savoir, sous la forme d'un vecteur, combien de non-NAs j'ai. Je veux la réponse Disponible pour moi comme:

2, 1, 3

Lorsque j'utilise la commande length(ZZZ), je reçois 3, qui est bien sûr le nombre de vecteurs dans les données .frame , une information assez précieuse.

J'ai d'autres fonctions qui fonctionnent sur ces données .image et me donner des réponses sous la forme de vecteurs, mais, dang-il, la longueur ne fonctionne pas comme ça.

22
na r
demandé sur Blue Magister 2011-02-13 21:47:26

4 réponses

, Essayez ceci:

# 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))))

Ayant couru:

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

Si vous insistez vraiment pour retourner un vecteur, vous pouvez utiliser as.vector, par exemple en définissant cette fonction:

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

Vous pouvez simplement exécuter nonNAs(ZZZ):

> nonNAs(ZZZ)
[1] 2 1 3
30
répondu daroczig 2011-02-13 19:04:54
colSums(!is.na(x))

Vectorisation ftw.

65
répondu hadley 2016-05-05 17:04:24

Pour obtenir le nombre total de valeurs manquantes, utilisez sum(is.na (x)) et pour l'utilisation en colonnes(is.na(x)) où x est variable qui contient un ensemble de données

5
répondu Geek_To_Learn 2014-06-08 20:41:05

Si vous voulez seulement la somme totale du NAs global, alors sum() avec !is.na () le fera:

ZZZ <- data.frame(n = c(1, 2, NA), m = c(6, NA, NA), o = c(7, 8, 8))
sum(!is.na(ZZZ))
1
répondu kmm 2011-02-13 19:02:16