3

我觉得这应该很容易,我已经看过互联网,但我不断收到错误消息。我过去做过很多分析,但对 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 创建一个向量,然后对数据进行子集化,但我不想要那个额外的步骤,我只希望它运行函数并忽略丢失的数据。

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

帮助表示赞赏。谢谢大家。

4

3 回答 3

3

我们可以包括na.rm = TRUEmean

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")
于 2017-04-05T17:01:50.463 回答
2

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

于 2017-04-05T17:01:08.333 回答
0

您可以将参数传递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
于 2017-04-05T17:15:14.743 回答