我创建了一个接收数据框的函数,并返回该数据框中数值变量的均值和中位数。当我测试函数时,有3个空值。我如何从中删除空值?
df.numeric.summary <- function(data.frame1){
variable.list=list()
numcols <- sapply(data,is.numeric)
for(i in 1:ncol(data.frame1)){
if (is.numeric(data.frame1[[i]]) == TRUE) {
variable.list[[i]]=list(c("Mean"=mean(data.frame1[[i]], na.rm = TRUE),"Median"=median(data.frame1[[i]]), "IQR"=IQR(data.frame1[[i]])))
}
}
return(variable.list)
}
我的输出如下:
[[1]]
NULL
[[2]]
NULL
[[3]]
NULL
[[4]]
[[4]][[1]]
Mean Median IQR
10.76687 3.56400 7.75100
[[5]]
[[5]][[1]]
Mean Median IQR
10.43467 1.40000 4.50100
[[6]]
[[6]][[1]]
Mean Median IQR
3.701434 0.839000 2.429500
而输出应该如下所示
$Pb1
Mean Median IQR
10.76687 3.56400 7.75100
$Pb2
Mean Median IQR
10.43467 1.40000 4.50100
$Pb3
Mean Median IQR
3.701434 0.839000 2.429500
答案 0 :(得分:0)
您必须使用na.rm=TRUE
x <- c(1,2,5,7,NA,3)
mean(x) # returns NA
# [1] NA
mean(x, na.rm=TRUE) # returns 3.6
# [1] 3.6
同样适用于中位数计算。
答案 1 :(得分:0)
在计算na.rm = T
或lapply
时,sapply
或mean
作为选项传递median
应该有帮助
> iris1 <- iris
>
> #imputing NA
>
> iris1[2,3] <- NA
>
> iris1[3,2] <- NA
>
> #without na.rm
>
> lapply(iris1[1:4], mean)
$Sepal.Length
[1] 5.843333
$Sepal.Width
[1] NA
$Petal.Length
[1] NA
$Petal.Width
[1] 1.199333
>
>
> lapply(iris1[1:4], mean, na.rm = T)
$Sepal.Length
[1] 5.843333
$Sepal.Width
[1] 3.056376
$Petal.Length
[1] 3.773826
$Petal.Width
[1] 1.199333
>
> lapply(iris1[1:4], median, na.rm = T)
$Sepal.Length
[1] 5.8
$Sepal.Width
[1] 3
$Petal.Length
[1] 4.4
$Petal.Width
[1] 1.3
答案 2 :(得分:0)
如果您只使用Filter()
和Map()
例如
df.numeric.summary <- function(data.frame1){
my_summary <- function(x) c(
"Mean"=mean(x, na.rm = TRUE),
"Median"=median(x, na.rm=TRUE),
"IQR"=IQR(x, na.rm=TRUE))
Map(my_summary, Filter(is.numeric, data.frame1))
}
您可以使用
进行测试df.numeric.summary(iris)