che ho fatto una funzione di somma personalizzata che ignora NA
s meno che tutti sono NA
. Quando lo uso in dplyr
restituisce risultati strani e non so perché.funzione di somma personalizzato in dplyr restituisce risultati inconsistenti
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))
mi dà
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
In questo caso è solo sommando su un valore, ma nella mia più grande applicazione in estate forza sui valori multipli. Avvolgere la mia funzione sum0
in as.integer()
sembra risolvere il problema, ma non potrei dirti perché.
E 'questo il modo corretto per risolvere questo problema? C'è qualcosa di ovvio che mi manca?
> 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
io non sono sicuro se questo è il modo migliore per scrivere la funzione, ma quella linea è destinata a verificare se tutti i valori sono 'NA's. quindi 'sum0 (c (NA, 3, NA))' restituisce 3, ma 'sum0 (c (NA, NA, NA))' restituisce 'NA'. – Tom
'sum (x, na.rm = ifelse (tutto (is.na (x)), FALSE, TRUE))' lavoro? – rawr
C'è un comportamento leggermente diverso tra 'mean' e' sum' quando si usa 'na.rm = T'. Se tutti sono 'NA',' mean' restituisce 'NaN', mentre' sum' restituisce 0. – Tom