2017-10-16 129 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