2015-05-21 15 views
5

sum function 0 अगर यह एक खाली सेट पर लागू होता है तो 0 देता है। क्या एनए मूल्यों के एक सेट पर लागू होने पर इसे एनए वापस करने का कोई आसान तरीका है?0 के बजाए एनए एनए के खाली सेट/सेट का योग बनाएं?

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 

मैं नाम प्रति तीन चर का योग करना चाहते हैं:

यहाँ एक borrowed उदाहरण है।

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) 

यह मैं देता है::

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

लेकिन मैं की जरूरत है:

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

नाम एक के लिए योग, var3 एनए होना चाहिए और न 0. यहाँ मैं क्या करने की कोशिश की है (बस स्पष्ट होने के लिए, यह नाम ए, var1 के लिए एनए नहीं होना चाहिए, जहां सेट में एक एनए है लेकिन मान्य मान भी जिन्हें सारांशित किया जाना चाहिए)। कोई विचार?

मैं na.action के साथ झुका रहा हूं लेकिन योग इन्हें स्वीकार नहीं कर रहा है।

उत्तर

6

आप कोशिश कर सकते हैं

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

या

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

या

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

धन्यवाद। अभी भी एक नौसिखिया और मैंने ऐसा करने के लिए अपना खुद का काम लिखने के बारे में नहीं सोचा था। मैंने सोचा कि योग के लिए एक बेहतर होगा जो मेरी मदद कर सकता है। – Kastany

+1

@ कस्टनी नहीं, यह एक अनोखा मामला है जहां हमें इसका उल्लेख करना होगा – akrun

संबंधित मुद्दे