首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >na.rm = FALSE和na.ram = na.rm之间有什么区别吗?

na.rm = FALSE和na.ram = na.rm之间有什么区别吗?
EN

Stack Overflow用户
提问于 2020-06-14 17:06:40
回答 1查看 1.9K关注 0票数 2

总之,na.rm = TRUE函数忽略了任何NA值。

如果na.rm = FALSE,则函数在计算中包含NA值。

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

这来自于R4DS,学习函数,并在输入中将na.rm设置为true或false。上面的THe代码应该与

代码语言:javascript
复制
     x / sum(x, na.rm = TRUE)

但是na.rm在原始表达式中是真的,但是在函数输入中它被设置为na.rm = FALSE,然后在sum()表达式中设置为na.rm = na.rm。

我看到,更好的做法是通常执行函数(x,na.rm = FALSE) {},允许用户更改它,并与和的默认设置保持一致。这是正确的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-14 17:25:41

许多基函数(如基R或任何特定包的基)都接受参数na.rm=,其中缺省值通常是FALSE。(有些函数使用useNA=na.action,这取决于不同的操作,但我们将忽略这些操作。)

高级函数(用户定义和/或其他包)也可能定义此参数,然后将其传递给其他函数。例如:

代码语言:javascript
复制
parent_func <- function(x, ..., na.rm = FALSE) {
  # something important
  mu <- mean(x, na.rm = na.rm)
  sigma <- sd(x, na.rm = na.rm)
  (mu - x) / sigma
}

一个前提是,如果您打算删除/忽略函数的一部分的NA值,您可能会在其他地方(或全部)使用它。

在本例中,在对mean(x, na.rm = na.rm)的调用中,左na.rm引用了mean定义中名为na.rm的参数。右na.rm指的是parent_func的同名参数。

定义这个父函数的另一种方法(为了区分变量)可以是:

代码语言:javascript
复制
parent_func <- function(x, ..., NARM = FALSE) {
  # something important
  mu <- mean(x, na.rm = NARM)
  sigma <- sd(x, na.rm = NARM)
  (mu - x) / sigma
}

使用na.rm=而不是这个NARM=的优点可能是一致性(尽管这并不总是R在所有函数中的优势之一)。许多用户可能比其他用户更直观地熟悉na.rm=参数名称、用途和效果。

编辑

--我发现,更好的做法是通常执行函数(x,na.rm = FALSE) {},允许用户更改它,并与和和均值的默认设置保持一致。这是正确的吗?

我相信是这样的。通常,我发现删除丢失的数据应该是用户的明确行为,而不是函数的默认操作。也就是说,如果丢失的数据意味着一个更大的问题,那么默认为na.rm=FALSE将很快向用户表明出了什么问题;na.rm=TRUE将掩盖这个问题,并在可能根本没有NA的情况下提出有效的结果。对于“较小的”函数(例如,meansum)来说,这是正确的,因此它的逻辑应该向外传递到封装函数。

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

https://stackoverflow.com/questions/62375724

复制
相关文章

相似问题

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