带有和不带有if语句的na.rm = TRUE的问题

时间:2018-11-20 03:43:55

标签: r na.rm

我在使na.rm表现出我想要的方式时遇到问题。我正在练习编写函数,目前正在编写平均值函数。 我的测试向量是t <- c(12,14, NA, 1) 我的两个测试是

  my.mean(t)
  my.mean(t, na.rm=TRUE) 

我的第一个函数通过了测试1,但是对于测试2仍然返回NA(应该为9)

my.mean <- function(x, na.rm) {
 stopifnot(is.numeric(x))
 answer <- sum(x)/length(x)
 return(answer)
}

然后,我更改了适用于第二个测试的函数,并返回9,但对于第一个测试,返回了Error in my.mean(t.2) : argument "na.rm" is missing, with no default

my.mean <- function(x, na.rm) {
    stopifnot(is.numeric(x))
    if na.rm=TRUE {na.omit()}
    answer <- sum(x)/length(x)
    return(answer)
}

2 个答案:

答案 0 :(得分:1)

您忘记了在第二个功能中为na.rm分配默认值。好的做法应该是添加默认值(例如TRUE)。此外,请注意,您的逻辑应该是==而不是=(并放在括号中),并且na.omit应该应用于x并返回:

my.mean <- function(x, na.rm = TRUE) {
    stopifnot(is.numeric(x))
    if (na.rm==TRUE) {x <- na.omit(x)}
    answer <- sum(x)/length(x)
    return(answer)
}

如果希望在函数中使用默认值,则可以在if语句中使用missing()函数:

my.mean <- function(x, na.rm) {
    stopifnot(is.numeric(x))
    if(!missing(na.rm) && na.rm == TRUE) {
        x <- na.omit(x)
    }
    answer <- sum(x)/length(x)
    return(answer)
}

请注意,在这种情况下,使用na.rm = FALSE应该返回NA,因为sum(t) = NA

my.mean(t)
#[1] NA
my.mean(t, na.rm = TRUE)
#[1] 9
my.mean(t, na.rm = FALSE)
#[1] NA

答案 1 :(得分:0)

您得到的错误只是说明您已定义参数(na.rm),而没有为其提供默认设置。在这种情况下,如果您未在调用中显式地给参数设置设置,则该函数将失败。

要为您的参数提供默认值,请执行以下操作:

my.mean<-function(x, na.rm=FALSE) ...

这将成为默认值FALSE。