2017-10-14 12 views
2

I ont la trame de données suivante:agrégat sur plusieurs variables, qui contiennent des valeurs NA

x <- read.table(text = " id1 id2 var1 var2 
1 a x 1 NA 
2 a x 2 4 
3 a y 2 5 
4 a y 4 9 
5 b x 1 7 
6 b y 4 4 
7 b x 3 9 
8 b y 2 8", header = TRUE) 

qui contient une valeur NA dans la première rangée. J'utilise la fonction aggregate() d'appliquer plusieurs fonctions de plusieurs variables dans un seul appel:

aggregate(cbind(var1, var2) ~ id1 + id2, data = x, 
      FUN = function(x) c(mn = mean(x), n = length(x))) 

Cela conduit à la sortie suivante:

id1 id2 var1.mn var1.n var2.mn var2.n 
1 a x  2  1  4  1 
2 b x  2  2  8  2 
3 a y  3  2  7  2 
4 b y  3  2  6  2 

Malheureusement, la ligne complète qui contient une valeur NA dans var2 est abandonné pour chaque variable (également var1).

Une solution pour utiliser la fonction aggregate() sur plusieurs variables dans un appel sans perdre toutes les lignes qui contiennent une valeur NA?

Ma sortie préférée devrait ressembler à ceci:

id1 id2 var1.mn var1.n var2.mn var2.n 
1 a x  1.5  2  4  1 
2 b x  2.0  2  8  2 
3 a y  3.0  2  7  2 
4 b y  3.0  2  6  2 

Répondre

1
aggregate(x[c("var1", "var2")], x[c("id1", "id2")], 
     function(x) c(mn = mean(x, na.rm = TRUE), n = sum(!is.na(x)))) 
# id1 id2 var1.mn var1.n var2.mn var2.n 
#1 a x  1.5 2.0  4  1 
#2 b x  2.0 2.0  8  2 
#3 a y  3.0 2.0  7  2 
#4 b y  3.0 2.0  6  2