2016-07-06 116 views
1

我想在數據框中找到我的數字列的偏度。在下面的代碼中使用的應用函數返回NULL。但是,當我直接將函數用於任何列時,它將返回值。應用函數返回NULL

library(mlbench) 
data(Glass) 
funNum= function(x){ 
    if(is.numeric(x)){return(skewness(x)) 
    } 
} 

funNum(Glass$Na) 
# [1] 0.4478343 

apply(Glass,2,funNum) 
# NULL 

請在上面的代碼中提示出了什麼問題。提前致謝!

+0

'apply(a,2,is.numeric)'給你什麼? – Carl

+0

'apply(a,2,is.numeric) RI Na Mg Mg Al Ca K Ba Ba Fe 假假假假假假假假假# – Apoorv

+0

請提供一個[最小](http://stackoverflow.com/help/mcve)和[reproducible](例如http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。在瀏覽其中至少一個鏈接後,請提供樣本數據和使用的代碼(例如'skewness')。請編輯您的問題,而不是添加評論,謝謝! – r2evans

回答

2

是的,我在評論中的猜測是正確的:你有因素!

sapply(Glass, class) 
#  RI  Na  Mg  Al  Si   K  Ca  Ba 
# "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" 
#  Fe  Type 
# "numeric" "factor" 

當您使用apply(),它會先強制Glass成矩陣。像矢量一樣,矩陣只能保存一種類型的數據。現在,你的數據框既有數字又有因子,結果矩陣只是字符。 skewness()在這種情況下無能爲力,因爲沒有列是數字的(所以你得到了NULL)。

如果您使用sapply()lapply(),情況就不同了。這些功能旨在與列表/數據框一起工作。您將獲得所有數字列的有效結果。

是否使用sapply()lapply()取決於你想要什麼。 sapply()只要可能就返回一個向量/矩陣,而lapply()返回一個列表(默認情況下)。我估計skewness()只返回一個標量結果,所以推薦使用sapply(),通過它你最終得到一個向量。如果你想要一個數據幀,可以使用as.data.frame(lapply(Glass, skewness))

+0

他也可以'apply(a [,1:9],2,funNum)',通過省略「因素」列轉換。 – r2evans

+0

明白了!非常感謝:) – Apoorv

+0

同意。不幸的是,兩者都返回一個「矩陣」而不是數據幀。 'lapply'可能更適合,因爲它至少更接近'data.frame'或'data.frame'特定的函數,例如'plyr'或'dplyr'提供的函數,但那些函數不是請求。 – r2evans

0

會發生什麼事是apply要挾到矩陣和數字列轉換爲字符讓你的函數返回NULL

嘗試

sapply(a,funNum) 

這種過度的a列將循環,不強迫到矩陣

+0

當所有列都是數字類型並返回正確結果時,它不會強制執行。 – Apoorv

+0

這是因爲在你有一個具有所有數字的DF的情況下,它強制使用數字矩陣 – Carl