2015-08-25 4 views
4

Quelqu'un sait-il comment regrouper par NA R.Aggregate par NA R

Si vous prenez l'exemple ci-dessous

a <- matrix(1,5,2) 
a[1:2,2] <- NA 
a[3:5,2] <- 2 
aggregate(a[,1], by=list(a[,2]), sum) 

La sortie est:

Group.1 x 
2  3 

Mais est-il un moyen d'obtenir la sortie pour inclure NAs dans la sortie comme ceci:

Group.1 x 
2  3 
NA  2 

Merci

Répondre

8

au lieu de aggregate(), vous pouvez envisager rowsum(). Il est en fait conçu pour cette opération exacte sur les matrices et est connu pour être beaucoup plus rapide que aggregate(). Nous pouvons ajouter NA aux niveaux de facteur de a[, 2] avec addNA(). Cela assurera que NA apparaît comme une variable de regroupement.

rowsum(a[, 1], addNA(a[, 2])) 
#  [,1] 
# 2  3 
# <NA> 2 

Si vous voulez continuer à utiliser aggregate(), vous pouvez intégrer addNA() aussi bien.

aggregate(a[, 1], list(Group = addNA(a[, 2])), sum) 
# Group x 
# 1  2 3 
# 2 <NA> 2 

Et une autre option avec les données .Table -

library(data.table) 
as.data.table(a)[, .(x = sum(V1)), by = .(Group = V2)] 
# Group x 
# 1: NA 2 
# 2:  2 3 
+0

enfin la bonne 'data.table' –

+0

alternatif Merci Richard, votre deuxième option est ce dont j'avais besoin. – wilsonm2

3

utilisation de récapituler dplyr

library(dplyr) 

a %>% 
    as.data.frame %>% 
    group_by(V2) %>% 
    summarize(V1_sum = sum(V1)) 
0

Vous pouvez également essayer de regrouper par is.na(a[,2]) à la place.

aggregate(a[,1], by=list(is.na(a[,2])), sum) 

# Group.1 x 
# 1 FALSE 3 
# 2 TRUE 2 

Si vous voulez une distinction plus fine que juste NA ou non, alors vous voudrez peut-être définir une nouvelle variable qui utilise une valeur précédemment utilisé pour désigner NA (un facteur serait plus élégant, mais un vecteur numérique est le plus simple):

b <- a[,2] 
b[is.na(b)] <- 999 
aggregate(a[,1], by=list(b), sum) 

# Group.1 x 
# 1  2 3 
# 2  999 2 
3

paquet de base

Une option est la fonction table en utilisant l'argument exclude = NULL:

a <- as.data.frame(a) 
table(a[, "V2"], exclude = NULL) 

sortie:

2 <NA> 
    3 2 

Si vous souhaitez inclure en-têtes de colunmn:

tbl <- data.frame(table(a[, "V2"], exclude = NULL)) 
colnames(tbl) <- c("Group", "x") 

    Group x 
1  2 3 
2 <NA> 2 

En utilisant sqldf:

a <- as.data.frame(a) 
sqldf("SELECT V2 [Group], SUM(V1) x 
     FROM a 
     GROUP BY V2") 

Sortie:

Group x 
1 NA 2 
2  2 3