2014-10-14 6 views
8

मैंने एक कस्टम योग फ़ंक्शन किया है जो NA एस को अनदेखा करता है जब तक कि सभी NA नहीं हैं। जब मैं dplyr में इसका उपयोग करता हूं तो यह अजीब परिणाम देता है और मुझे नहीं पता कि क्यों।dplyr रिटर्न में कस्टम योग फ़ंक्शन असंगत परिणाम

require(dplyr) 

dta <- data.frame(year=2007:2013, rrconf=c(79, NaN ,474,2792,1686,3313,3456), enrolled=c(NaN,NaN,458,1222,1155,1906,2184)) 

sum0 <- function(x, ...){ 
    # remove NAs unless all are NA 
    if(is.na(mean(x, na.rm=TRUE))) return(NA) 
    else(sum(x, ..., na.rm=TRUE)) 
} 

dta %>% 
    group_by(year) %>% 
    summarize(rrconf=sum0(rrconf), enrolled=sum0(enrolled)) 

मुझे

Source: local data frame [7 x 3] 

    year rrconf enrolled 
1 2007  79  NA 
2 2008  NA  NA 
3 2009 474  TRUE 
4 2010 2792  TRUE 
5 2011 1686  TRUE 
6 2012 3313  TRUE 
7 2013 3456  TRUE 

देता है इस मामले में यह केवल एक मान से अधिक संक्षेप किया जाता है, लेकिन एक से अधिक मान से अधिक हो सकता है गर्मियों में मेरी बड़ी आवेदन में। फ़ंक्शन को as.integer() में फिक्स करना ठीक लगता है, लेकिन मैं आपको क्यों नहीं बता सका।

क्या यह इस समस्या के आसपास काम करने का सही तरीका है? क्या मुझे कुछ याद आ रही है?

> sessionInfo() 
R version 3.1.0 (2014-04-10) 
Platform: i386-w64-mingw32/i386 (32-bit) 

locale: 
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252 
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C       
[5] LC_TIME=English_United Kingdom.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] dplyr_0.2 

loaded via a namespace (and not attached): 
[1] assertthat_0.1 magrittr_1.0.1 parallel_3.1.0 Rcpp_0.11.2 tools_3.1.0 
+0

मुझे यकीन है कि अगर यह सबसे अच्छा तरीका है समारोह लिखना है नहीं कर रहा हूँ लेकिन वह पंक्ति यह जांचने के लिए है कि सभी मूल्य 'एनए हैं। तो 'sum0 (सी (एनए, 3, एनए))' रिटर्न 3, लेकिन 'sum0 (सी (एनए, एनए, एनए))' रिटर्न 'एनए '। – Tom

+2

'योग (x, na.rm = ifelse (सभी (is.na (x)), गलत, सत्य)) 'काम? – rawr

+0

'na.rm = T' का उपयोग करते समय' माध्य 'और 'sum' के बीच थोड़ा अलग व्यवहार है। यदि सभी 'एनए 'हैं,' मतलब 'रिटर्न' NaN' है, जबकि 'sum' रिटर्न 0. – Tom

उत्तर

10

मुद्दा dplyr पहले लौट आए परिणाम के संदर्भ में स्तंभ प्रकार का निर्धारण करने के साथ हो रहा है। आप NA मूल्य है, जो डिफ़ॉल्ट रूप से किसी तार्किक मान है मजबूर हैं, तो एक NA_real_ या NA_integer_ होने के लिए है, तो आप हल हो जाएगा:

##Just to show what NA normally does first: 
class(NA) 
#[1] "logical" 

sum0 <- function(x, ...){ 
    # remove NAs unless all are NA 
    if(is.na(mean(x, na.rm=TRUE))) return(NA_real_) 
    else(sum(x, ..., na.rm=TRUE)) 
} 

dta %>% 
    group_by(year) %>% 
    summarize(rrconf=sum0(rrconf), enrolled=sum0(enrolled)) 

#Source: local data frame [7 x 3] 
# 
# year rrconf enrolled 
#1 2007  79  NA 
#2 2008  NA  NA 
#3 2009 474  458 
#4 2010 2792  1222 
#5 2011 1686  1155 
#6 2012 3313  1906 
#7 2013 3456  2184 
+0

धन्यवाद @ thelatemail जो समझ में आता है। तो आम तौर पर "सही" वर्ग में 'एनए' वापस करने वाले फ़ंक्शन क्या करते हैं? यही कारण है कि यह समस्या केवल मेरे कस्टम फ़ंक्शन के साथ होती है? उदाहरण के लिए, मुझे लगता है कि 'वर्ग (योग (एनए)) '' पूर्णांक' 'तार्किक 'नहीं है। – Tom

+1

@ टॉम - हाँ, इसे विभिन्न आर ऑब्जेक्ट प्रकारों के पदानुक्रम के साथ करना है। यह थोड़ा उलझन में है लेकिन शायद यह प्रश्न मदद करेगा: http://stackoverflow.com/questions/21763355/rbind-data-frame-conversion-type-hierarchy- मुझे लगता है कि यह 'dplyr' विशिष्ट हो सकता है हालांकि कुछ ' कक्षा (सी (एनए, 1)) 'आधार आर – thelatemail

+2

में उचित रूप से निपटाया गया है प्रदर्शन कारणों से, dplyr मानता है कि उत्परिवर्तन परिणाम "स्थिर प्रकार" हैं - यानी पहले तत्व का प्रकार सभी बाद के तत्वों का प्रकार है। एक दिन हम इस प्रतिबंध को आराम करने में सक्षम हो सकते हैं, लेकिन तब तक, सुनिश्चित करें कि आपका फ़ंक्शन एक सतत प्रकार के परिणाम देता है। – hadley

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