2016-08-23 48 views
2

是否有人可以解釋apply()sapply()如何在數據幀的上運行?數據幀列應用和sapply之間的區別?

例如,試圖找到類每列的數據幀時,我的第一個傾向是對列使用apply

> apply(iris, 2, class) 
Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
"character" "character" "character" "character" "character" 

這是不正確的,因爲有一些的,列是數字:

> class(iris$Petal.Length) 
[1] "numeric" 

在谷歌快速搜索止跌回升this solution針對使用sapply而不是apply問題:

> sapply(iris, class) 
Sepal.Length Sepal.Width Petal.Length Petal.Width  Species 
    "numeric" "numeric" "numeric" "numeric"  "factor" 

在這種情況下,sapply被隱式轉換iris到一個列表,然後將函數列表中的每個條目,如:

> class(as.list(iris)$Petal.Length) 
[1] "numeric" 

我還有什麼不清楚的是爲什麼我的原嘗試使用apply不起作用。

回答

2

往往似乎是這樣,我在寫出它的過程中想出了我的問題的答案。在這裏發佈答案,以防其他人有相同的問題。

?apply狀態以細看:

如果「X」不是一個數組,但一個類的對象,具有一個非空「變暗」 值(如數據幀), 'apply'嘗試通過'as.matrix'將它強制轉換爲 數組,如果它是二維的(例如數據幀)或通過'as.array'或 。

所以就像sapply鑄數據幀到list上操作之前,apply鑄數據幀到matrix。由於矩陣不能有混合類型,並且至少有一列包含非數字數據(Species),因此所有內容都將變成字符數據:

> class(as.matrix(iris)[,'Petal.Length']) 
[1] "character"