忽略函数中的 NA 值
Ignoring NA values in function
我正在编写自己的函数来计算数据集中列的平均值,然后使用 apply()
应用它,但它仅 returns 第一列的平均值。下面是我的代码:
mymean <- function(cleaned_us){
column_total = sum(cleaned_us)
column_length = length(cleaned_us)
return (column_total/column_length)
}
Average_2 <- apply(numeric_clean_usnews,2,mymean,na.rm=T)
我们需要在 sum
中使用 na.rm=TRUE
而在 apply
中使用它是行不通的,因为 mymean
没有那个参数
mymean <- function(cleaned_us){
column_total = sum(cleaned_us, na.rm = TRUE) #change
column_length = sum(!is.na(cleaned_us)) #change
return(column_total/column_length)
}
请注意,colMeans
可用于获取每列的 mean
。
为了将na.rm
参数传递给您定义的函数,您需要将其作为函数的参数。 sum()
函数有一个 na.rm
参数,但 length()
没有。因此,要编写您尝试编写的函数,您可以说:
# include `na.rm` as a param of the argument
mymean <- function(cleaned_us, na.rm){
# pass it to `sum()`
column_total = sum(cleaned_us, na.rm=na.rm)
# if `na.rm` is set to `TRUE`, then don't count `NA`s
if (na.rm==TRUE){
column_length = length(cleaned_us[!is.na(cleaned_us)])
# but if it's `FALSE`, just use the full length
} else {
column_length = length(cleaned_us)
}
return (column_total/column_length)
}
那么你的电话应该可以工作:
Average_2 <- apply(numeric_clean_usnews, 2, mymean, na.rm=TRUE)
使用na.omit()
set.seed(1)
m <- matrix(sample(c(1:9, NA), 100, replace=TRUE), 10)
mymean <- function(cleaned_us, na.rm){
if (na.rm) cleaned_us <- na.omit(cleaned_us)
column_total = sum(cleaned_us)
column_length = length(cleaned_us)
column_total/column_length
}
apply(m, 2, mymean, na.rm=TRUE)
# [1] 5.000 5.444 4.111 5.700 6.500 4.600 5.000 6.222 4.700 6.200
我正在编写自己的函数来计算数据集中列的平均值,然后使用 apply()
应用它,但它仅 returns 第一列的平均值。下面是我的代码:
mymean <- function(cleaned_us){
column_total = sum(cleaned_us)
column_length = length(cleaned_us)
return (column_total/column_length)
}
Average_2 <- apply(numeric_clean_usnews,2,mymean,na.rm=T)
我们需要在 sum
中使用 na.rm=TRUE
而在 apply
中使用它是行不通的,因为 mymean
没有那个参数
mymean <- function(cleaned_us){
column_total = sum(cleaned_us, na.rm = TRUE) #change
column_length = sum(!is.na(cleaned_us)) #change
return(column_total/column_length)
}
请注意,colMeans
可用于获取每列的 mean
。
为了将na.rm
参数传递给您定义的函数,您需要将其作为函数的参数。 sum()
函数有一个 na.rm
参数,但 length()
没有。因此,要编写您尝试编写的函数,您可以说:
# include `na.rm` as a param of the argument
mymean <- function(cleaned_us, na.rm){
# pass it to `sum()`
column_total = sum(cleaned_us, na.rm=na.rm)
# if `na.rm` is set to `TRUE`, then don't count `NA`s
if (na.rm==TRUE){
column_length = length(cleaned_us[!is.na(cleaned_us)])
# but if it's `FALSE`, just use the full length
} else {
column_length = length(cleaned_us)
}
return (column_total/column_length)
}
那么你的电话应该可以工作:
Average_2 <- apply(numeric_clean_usnews, 2, mymean, na.rm=TRUE)
使用na.omit()
set.seed(1)
m <- matrix(sample(c(1:9, NA), 100, replace=TRUE), 10)
mymean <- function(cleaned_us, na.rm){
if (na.rm) cleaned_us <- na.omit(cleaned_us)
column_total = sum(cleaned_us)
column_length = length(cleaned_us)
column_total/column_length
}
apply(m, 2, mymean, na.rm=TRUE)
# [1] 5.000 5.444 4.111 5.700 6.500 4.600 5.000 6.222 4.700 6.200