R中NA值的问题
我觉得这应该是一件容易的事情,我已经在网上查过了,但我一直收到错误消息。我在过去做过很多分析,但我对R和编程是新手 我有一个非常基本的函数来计算x列数据的平均值:R中NA值的问题,r,function,missing-data,na.rm,R,Function,Missing Data,Na.rm,我觉得这应该是一件容易的事情,我已经在网上查过了,但我一直收到错误消息。我在过去做过很多分析,但我对R和编程是新手 我有一个非常基本的函数来计算x列数据的平均值: columnmean <-function(y){ nc <- ncol(y) means <- numeric(nc) for(i in 1:nc) { means[i] <- mean(y[,i]) } means } 我回来了: NA NA 9.957516 77.88
columnmean <-function(y){
nc <- ncol(y)
means <- numeric(nc)
for(i in 1:nc) {
means[i] <- mean(y[,i])
}
means
}
我回来了:
NA NA 9.957516 77.882353 6.993464 15.803922
因为AQ中的前两个变量包含NAs。K、 酷。我想抑制NAs,这样R将忽略它们并无论如何运行该函数
我读到我可以用na.rm=TRUE来指定它,比如:
columnmean(airquality, na.rm = TRUE)
但当我这样做时,我会收到一条错误消息,上面说:
“列平均值错误(空气质量,na.rm=TRUE):
未使用的参数(na.rm=TRUE)”
我读遍了所有我只需要包含na.rm=TRUE的地方,函数将运行并忽略na值…但我一直得到这个错误。我还尝试过使用=“complete”和我能找到的任何其他内容
两个警告:
我知道我可以用is.na创建一个向量,然后对数据进行子集,但我不想做额外的步骤,我只想让它运行函数并忽略缺少的数据
我也知道我可以在函数中指定忽略或不忽略,但我希望有一种方法可以选择动态忽略/不忽略,一个动作一个动作,而不是让它成为函数本身的一部分
谢谢你的帮助。谢谢大家。您应该在
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我们可以将na.rm=TRUE
包含在mean
columnmean <-function(y){
nc <- ncol(y)
means <- numeric(nc)
for(i in 1:nc) {
means[i] <- mean(y[,i], na.rm = TRUE)
}
means
}
数据
df1您可以将参数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
columnmean您必须在mean
中包含na.rm=TRUE
在R中已经有一个内置函数:colMeans(airquality,na.rm=TRUE)
@MrFlick-是的,我知道,我正在自学用R编写函数,所以我选择了一个非常简单的函数,我知道我可以很容易地检查它。谢谢您的回答。我读过关于该选项的内容,但理想情况下,我希望能够在调用中指定是否忽略……有时我想忽略NAs,有时我不想。这不是一个选项?@Adam_S那么你可以在函数参数中使用3个点…
和平均值是的,完美。非常感谢您花时间回答一个非常基本的问题!谢谢你的回答。另一种说法是…因为这是我编写的函数,所以调用它时不能指定ignore NAs Y/N,我必须在编写函数时指定它?有时我想忽略NAs,但有时我不想。这不是一个选择吗?
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")
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