如何删除列表中的空值

时间:2017-10-16 13:16:50

标签: r function null

我创建了一个接收数据框的函数,并返回该数据框中数值变量的均值和中位数。当我测试函数时,有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 

3 个答案:

答案 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 = Tlapply时,sapplymean作为选项传递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)