2017-10-16 126 views
-2

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

你是指NULL还是NA?它们在R中有所不同。请提供一个[可重现的示例](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)以及样本输入数据。 – MrFlick

+0

我添加了我的代码。 – Hannah

+0

什么是期望的输出。你正在分配'variable.list [[i]]',但是'i = 1'这个列看起来不是数字。所以你第一次分配是当'i = 4'离开那些NULL值时。 – MrFlick

回答

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) 
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 

同样,对于中位数演算通货膨胀。

0

lapplysapply传递na.rm = T作为一个选项,而计算meanmedian应该帮助

> 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 
+0

我没有使用lapply或sapply函数 – Hannah

+0

@Hannah只有当您分享您尝试的代码时,我们才能知道。 – amrrs

+0

我用我的代码更新了这个问题 – Hannah