【发布时间】:2014-10-14 01:14:01
【问题描述】:
我创建了一个自定义求和函数,它会忽略 NAs,除非全部都是 NA。当我在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() 中包装我的sum0 函数似乎可以解决它,但我无法告诉你原因。
这是解决此问题的正确方法吗?我有什么明显的遗漏吗?
> 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
【问题讨论】:
-
我不确定这是否是编写函数的最佳方式,但该行旨在测试是否所有值都是
NAs。所以sum0(c(NA,3,NA))返回 3,但sum0(c(NA,NA,NA))返回NA。 -
sum(x, na.rm = ifelse(all(is.na(x)), FALSE, TRUE))工作? -
mean和sum在使用na.rm=T时的行为略有不同。如果都是NA,则mean返回NaN,而sum返回0。 -
@rawr 怎么样
sum(x, na.rm = !all(is.na(x)) -
令人困惑的是,如果我先运行
dta$enrolled[1] <- 10,我可以使代码工作,以确保处理的第一个值不是NaN。这对我来说似乎是一个错误,dplyr假设变量类型。我还可以通过设置第一个值NaN来使任何列失败。