gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:55:27 24 4
gpt4 key购买 nike

对于max之类的命令,默认情况下将na.rm选项设置为FALSE。我知道这通常是个好主意,但我想暂时将其关闭-也就是在 session 期间。

每当有选项时,我如何要求R设置na.rm = TRUE?我发现

options(na.action = na.omit)

但这不起作用。我知道我可以为我编写的每个函数设置 na.rm=TRUE选项。
my.max <- function(x) {max(x, na.rm=TRUE)}

但这不是我想要的。我想知道是否可以在全局/通用范围内做更多的事情,而不是对每个功能都做些。

最佳答案

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

  • 列出所有以na.rm作为参数的函数。在这里,我将搜索范围限制在基本包中。
  • 获取每个函数,并在其主体的开头添加以下行:na.rm = TRUE
  • 将函数分配回基本软件包。

  • 因此,首先我将所有以 na.rm作为参数的函数存储在列表(ll)中:
    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注释)
    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列表如下所示:
     [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包(常见问题解答2.23)中获得的,该包在 rbind.data.framecbind.data.frame的开头添加了一行。
    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())
    }
    }
    })

    如果您选择否,则为列表中每个功能的第一行:
    unique(lapply(na.rm.f,function(x) body(get(x))[[2]]))
    [[1]]
    na.rm = TRUE

    关于r - 是否可以将na.rm全局设置为TRUE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17418640/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com