2015-05-21 4 views
5

Die sum function gibt 0 zurück, wenn sie auf einen leeren Satz angewendet wird. Gibt es eine einfache Möglichkeit, NA wiederzugeben, wenn es auf einen Satz von NA-Werten angewendet wird? Hierdie Summe einer leeren Menge/Menge von NAs NA statt 0 machen?

ist ein borrowed Beispiel:

test <- data.frame(name = rep(c("A", "B", "C"), each = 4), 
       var1 = rep(c(1:3, NA), 3), 
       var2 = 1:12, 
       var3 = c(rep(NA, 4), 1:8)) 

test 
    name var1 var2 var3 
1  A 1 1 NA 
2  A 2 2 NA 
3  A 3 3 NA 
4  A NA 4 NA 
5  B 1 5 1 
6  B 2 6 2 
7  B 3 7 3 
8  B NA 8 4 
9  C 1 9 5 
10 C 2 10 6 
11 C 3 11 7 
12 C NA 12 8 

Ich mag würde pro Namen haben die Summe der drei Variablen. Hier ist, was ich versucht:

var_to_aggr <- c("var1","var2","var3") 
aggr_by <- "name" 
summed <- aggregate(test[var_to_aggr],by=test[aggr_by],FUN="sum", na.rm = TRUE) 

Das gibt mir:

 name var1 var2 var3 
1 A 6 10 0 
2 B 6 26 10 
3 C 6 42 26 

Aber ich brauche:

 name var1 var2 var3 
1 A 6 10 NA 
2 B 6 26 10 
3 C 6 42 26 

Die Summe für Namen A, var3 sollte NA und nicht 0 (Nur um klar zu sein, sollte es nicht NA für den Namen A, var1 sein, wobei das Set eine NA enthält, aber auch gültige Werte, die zusammengefasst werden sollten). Irgendwelche Ideen?

Ich habe mit na.action hantiert, aber die Summe scheint diese nicht zu akzeptieren.

Antwort

6

können Sie versuchen,

f1 <- function(x) if(all(is.na(x))) NA_integer_ else sum(x, na.rm=TRUE) 
aggregate(.~name, test, FUN=f1, na.action=NULL) 

Oder

library(dplyr) 
test %>% 
    group_by(name) %>% 
    summarise_each(funs(f1)) 

Oder

library(data.table) 
setDT(test)[, lapply(.SD, f1), name] 
+0

Danke. Immer noch ein Anfänger und ich dachte nicht daran, meine eigene Funktion dafür zu schreiben. Ich dachte, es wäre ein Parameter für die Summe, der mir helfen könnte. – Kastany

+1

@Kastany Nein, das ist ein einzigartiger Fall, wo wir es speziell erwähnen müssen – akrun

Verwandte Themen