Zrobiłem niestandardową funkcję sumy, która ignoruje NA
s, chyba że wszystkie są NA
. Kiedy używam go w dplyr
, zwraca wyniki nieparzyste i nie wiem dlaczego.Funkcja sumy niestandardowej w dplyr zwraca niespójne wyniki
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))
daje mi
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
W tym przypadku jest to podsumowującej tylko na jednej wartości, ale w moim większego zastosowania w lecie może nad wieloma wartościami. Zawijanie mojej funkcji sum0
w as.integer()
wydaje się to naprawić, ale nie mogłem ci powiedzieć dlaczego.
Czy to jest właściwy sposób na obejście tego problemu? Czy jest coś oczywistego, czego mi brakuje?
> 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
Nie jestem pewien, czy jest to najlepszy sposób napisać funkcję, ale linia ta ma na celu sprawdzenie, czy wszystkie wartości są "NA". więc 'sum0 (c (NA, 3, NA))' zwraca 3, ale 'sum0 (c (NA, NA, NA))' zwraca 'NA'. – Tom
'sum (x, na.rm = ifelse (all (is.na (x)), FALSE, TRUE))' działa? – rawr
Istnieje nieco inne zachowanie pomiędzy 'mean' i' sum' przy użyciu 'na.rm = T'. Jeśli wszystkie są "NA", "średnia" zwraca 'NaN', podczas gdy' suma 'zwraca 0. – Tom