应用函数返回NULL

时间:2016-07-06 17:22:33

标签: r apply

我试图在数据框中找到我的数字列的偏斜。以下代码中使用的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

请在上面的代码中说明错误。提前谢谢!

2 个答案:

答案 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列,而不会强制转换为矩阵

相关问题