首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以将na.rm全局设置为TRUE?

是否可以将na.rm全局设置为TRUE?
EN

Stack Overflow用户
提问于 2013-07-02 14:17:01
回答 4查看 7.1K关注 0票数 24

对于像max这样的命令,默认情况下选项na.rm被设置为FALSE。我理解为什么这通常是一个好主意,但我想在一段时间内可逆地关闭它--即在会话期间。

当R是一个选项时,我如何才能要求R设置na.rm = TRUE?我发现

代码语言:javascript
复制
options(na.action = na.omit)

但这不管用。我知道我可以为我编写的每个函数设置一个na.rm=TRUE选项。

代码语言:javascript
复制
my.max <- function(x) {max(x, na.rm=TRUE)}

但这不是我要找的。我想知道是否有一些事情我可以做得更全局/更普遍,而不是为每个函数都做。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-01 07:39:16

无法将na.rm全局更改为TRUE。(见Hong Ooi在问题下的评论。)

编辑:

不幸的是,您不想要的答案通常是唯一有效的。没有像na.action那样的全局选项,它只影响lm、glm等建模函数(即使在那里,也不能保证在所有情况下都能工作)。-洪晃7月2 '13在6:23

票数 9
EN

Stack Overflow用户

发布于 2013-07-02 18:20:23

一种解决方法(危险)是执行以下操作:

  1. 列出所有以na.rm作为参数的函数。在这里,我将搜索限制在基包中。na.rm = TRUE
  2. Assign
  3. 获取每个函数,并将该行添加到其主体的开头:将函数返回到基包。

因此,首先我将所有以na.rm为参数的函数存储在一个列表(ll)中:

代码语言:javascript
复制
uses_arg <- function(x,arg) 
  is.function(fx <- get(x)) && 
  arg %in% names(formals(fx))
basevals <- ls(pos="package:base")      
na.rm.f <- basevals[sapply(basevals,uses_arg,'na.rm')]

编辑更好的方法来获得所有na.rm的参数函数(感谢mnel注释)

代码语言:javascript
复制
Funs <- Filter(is.function,sapply(ls(baseenv()),get,baseenv()))
na.rm.f <- names(Filter(function(x) any(names(formals(args(x)))%in% 'na.rm'),Funs))

因此,na.rm.f列表如下所示:

代码语言:javascript
复制
 [1] "all"                     "any"                     "colMeans"                "colSums"                
 [5] "is.unsorted"             "max"                     "mean.default"            "min"                    
 [9] "pmax"                    "pmax.int"                "pmin"                    "pmin.int"               
[13] "prod"                    "range"                   "range.default"           "rowMeans"               
[17] "rowsum.data.frame"       "rowsum.default"          "rowSums"                 "sum"                    
[21] "Summary.data.frame"      "Summary.Date"            "Summary.difftime"        "Summary.factor"         
[25] "Summary.numeric_version" "Summary.ordered"         "Summary.POSIXct"         "Summary.POSIXlt" 

然后,对于我更改正文的每个函数,代码的灵感来自于data.table包(FAQ2.23),该包在rbind.data.framecbind.data.frame的开头添加了一行。

代码语言:javascript
复制
ll <- lapply(na.rm.f,function(x)
  {
  tt <- get(x)
  ss = body(tt)
  if (class(ss)!="{") ss = as.call(c(as.name("{"), ss))
  if(length(ss) < 2) print(x)
  else{
    if (!length(grep("na.rm = TRUE",ss[[2]],fixed=TRUE))) {
      ss = ss[c(1,NA,2:length(ss))]
      ss[[2]] = parse(text="na.rm = TRUE")[[1]]
      body(tt)=ss
      (unlockBinding)(x,baseenv())
      assign(x,tt,envir=asNamespace("base"),inherits=FALSE)
      lockBinding(x,baseenv())
      }
    }
  })

不,如果你检查,我们列表中每个函数的第一行:

代码语言:javascript
复制
unique(lapply(na.rm.f,function(x) body(get(x))[[2]]))
[[1]]
na.rm = TRUE
票数 11
EN

Stack Overflow用户

发布于 2017-06-09 17:22:08

对于我的R包,我覆盖了现有的函数meansum。感谢伟大的Ben (下面的评论),我将我的函数修改为:

代码语言:javascript
复制
mean <- function(x, ..., na.rm = TRUE) {
  base::mean(x, ..., na.rm = na.rm)
}

在此之后,用mean(c(2, NA, 3)) = 2.5代替NA

而对于sum

代码语言:javascript
复制
sum <- function(x, ..., na.rm = TRUE) {
  base::sum(x, ..., na.rm = na.rm)
}

这将产生sum(c(2, NA, 3)) = 5而不是NA

sum(c(2, NA, 3, NaN))也可以工作。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17418640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档