我试图在数据框中找到我的数字列的偏斜。以下代码中使用的apply函数返回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 :(得分: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))
。
答案 1 :(得分:0)
apply
强制执行矩阵并将数字列转换为字符,以便函数返回NULL
尝试
sapply(a,funNum)
这将循环遍历a
列,而不会强制转换为矩阵