2015-08-25 4 views
4

Кто-нибудь знает, как агрегировать по NA в R.Совокупные по NA в R

Если взять пример ниже

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

Выход:

Group.1 x 
2  3 

Но есть способ получить выход для включения NA в выходные данные следующим образом:

Group.1 x 
2  3 
NA  2 

Благодаря

ответ

8

Вместо aggregate(), вы можете рассмотреть rowsum(). Он фактически предназначен для этой точной операции над матрицами и, как известно, намного быстрее, чем aggregate(). Мы можем добавить NA к уровням факторов a[, 2] с addNA(). Это гарантирует, что NA отображается как переменная группировки.

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

Если вы все еще хотите использовать aggregate(), вы можете включить addNA() а.

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

И еще один вариант с данными .Таблица -

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

наконец правильный 'data.table' альтернатива –

+0

Спасибо, Ричард, второй вариант - это то, что мне нужно. – wilsonm2

3

Использование резюмировать из dplyr

library(dplyr) 

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

Вы также можете попробовать агрегирование по is.na(a[,2]) вместо.

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

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

Если вы хотите более тонкое различие, чем просто NA или нет, то вы можете определить новую переменную, которая использует ранее неиспользуемые значения для обозначения NA (фактор будет более изящным, но числовой вектор самый простой):

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

Базовый пакет

Одним из вариантов является функция table с помощью аргумента exclude = NULL:

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

Выход:

2 <NA> 
    3 2 

Если вы хотели бы включить colunmn заголовки:

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

    Group x 
1  2 3 
2 <NA> 2 

sqldf Использование:

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

Выход:

Group x 
1 NA 2 
2  2 3 
Смежные вопросы