【问题标题】:Issue with NA values in RR中的NA值问题
【发布时间】:2017-08-31 10:19:25
【问题描述】:

我觉得这应该很容易,我在互联网上查看过 x ,但我不断收到错误消息。我过去做过很多分析,但对 R 和编程很陌生。

我有一个非常基本的函数来计算 x 列数据的平均值:

columnmean <-function(y){
  nc <- ncol(y)
  means <- numeric(nc)
  for(i in 1:nc) {
    means[i] <- mean(y[,i])
  }
    means 
}

我在 RStudio 中并使用包含的“空气质量”数据集对其进行测试。当我加载 AQ 数据集并运行我的函数时:

data("airquality")
columnmean(airquality)

我回来了:

NA NA 9.957516 77.882353 6.993464 15.803922

因为 AQ 中的前两个变量中有 NA。克,酷。我想抑制 NA,以便 R 将忽略它们并运行该函数。

我读到我可以用 na.rm=TRUE 指定这个,比如:

columnmean(airquality, na.rm = TRUE)

但是当我这样做时,我收到一条错误消息:

“列均值错误(空气质量,na.rm = TRUE): 未使用的参数 (na.rm = TRUE)"

我正在阅读所有我只需要包含 na.rm = TRUE 的地方,该函数将运行并忽略 NA 值......但我不断收到此错误。我也尝试过 use = "complete" 和我能找到的任何其他东西。

两个注意事项:

我知道我可以使用 is.na 创建一个向量,然后对数据进行子集化,但我不想要那个额外的步骤,我只想让它运行函数并忽略丢失的数据。

我也知道我可以在函数中指定忽略或不忽略,但我想要一种方法来选择忽略/不忽略,在逐个动作的基础上,而不是让它成为其中的一部分函数本身。

感谢您的帮助。谢谢大家。

【问题讨论】:

  • 你必须在mean中包含na.rm=TRUE
  • R 中已经有一个内置函数:colMeans(airquality, na.rm=TRUE)
  • @MrFlick - 是的,我知道,我正在自学用 R 编写函数,所以我选择了一个非常简单的,我知道我可以轻松检查。

标签: r function missing-data na.rm


【解决方案1】:

您可以将参数na.rm 传递给您的函数:

columnmean <- function(y, na.rm = FALSE){
  nc <- ncol(y)
  means <- numeric(nc)
  for(i in 1:nc) {
    means[i] <- mean(y[,i], na.rm = na.rm)
  }
  means 
}

data("airquality")
columnmean(airquality, na.rm = TRUE)
#[1] 42.129310 185.931507   9.957516  77.882353   6.993464  15.803922

columnmean(airquality)
#[1]        NA        NA  9.957516 77.882353  6.993464 15.803922

但我的建议是寻找循环的替代代码:

column_mean <- function(y, na.rm = FALSE) {
  sapply(y, function(x) mean(x, na.rm = na.rm))
}

column_mean(airquality, na.rm = TRUE)
#     Ozone    Solar.R       Wind       Temp      Month        Day 
# 42.129310 185.931507   9.957516  77.882353   6.993464  15.803922

【讨论】:

    【解决方案2】:

    我们可以在mean 中包含na.rm = TRUE

    columnmean <-function(y){
      nc <- ncol(y)
      means <- numeric(nc)
      for(i in 1:nc) {
        means[i] <- mean(y[,i], na.rm = TRUE)
      }
       means 
    }
    

    如果我们需要使用na.rm 参数有时为 FALSE,有时为 TRUE,则在 'columnmean' 的参数中指定

    columnmean <-function(y, ...){
        nc <- ncol(y)
      means <- numeric(nc)
       for(i in 1:nc) {
         means[i] <- mean(y[,i], ...)
       }
       means 
      }
    
    columnmean(df1, na.rm = TRUE)
    #[1] 1.5000000 0.3333333
     columnmean(df1, na.rm = FALSE)
    #[1] 1.5  NA
    

    数据

     df1 <- structure(list(num = c(1L, 1L, 2L, 2L), x1 = c(1L, NA, 0L, 0L
     )), .Names = c("num", "x1"), row.names = c(NA, -4L), class = "data.frame")
    

    【讨论】:

    • 感谢您的回答。我阅读了有关该选项的信息,但理想情况下,我希望能够在通话中指定是否忽略...有时我想忽略 NA,有时我不想。这不是一个选项?
    • @Adam_S 然后你可以在函数参数中使用 3 个点 ... 以及 mean
    • 是的,完美。非常感谢您花时间回答一个非常基本的问题!
    【解决方案3】:

    您应该在mean 函数调用中使用该参数:

    columnmean <-function(y){
      nc <- ncol(y)
      means <- numeric(nc)
      for(i in 1:nc) {
        means[i] <- mean(y[,i], na.rm = TRUE)
      }
        means 
    }
    

    columnmean 是自定义函数,没有那个参数。

    【讨论】:

    • 感谢您的回答。另一种表达你在说什么的方式......因为它是我写的一个函数,我不能在调用它时指定忽略 NAs Y/N,我必须在编写函数时指定它?有时我想忽略 NA,有时我不想。这不是一个选项?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2021-03-10
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多