R 中的 NA 值问题

Issue with NA values in R

我觉得这应该很简单,我在网上查过,但总是收到错误消息。我过去做过很多分析,但我是 R 和编程的新手。

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

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

我在 RStudio 中并使用包含的 'airquality' 数据集对其进行测试。当我加载 AQ 数据集和 运行 我的函数时:

data("airquality")
columnmean(airquality)

我回来了:

不适用 不适用 9.957516 77.882353 6.993464 15.803922

因为AQ中的前两个变量里面有NA。 K,酷。我想抑制 NA,这样 R 将忽略它们,并且 运行 函数仍然存在。

我读到我可以用 na.rm=TRUE 指定它,例如:

columnmean(airquality, na.rm = TRUE)

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

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

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

两个注意事项:

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

我也知道我可以在函数中指定忽略或不忽略,但我想要一种方法来选择 ignore/not 即时忽略,逐个操作,而不是让它是函数本身的一部分。

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

您应该在 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 是自定义函数,没有那个参数。

我们可以在 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.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