应用返回 NULL 的函数

Apply function returning NULL

我正在尝试查找数据框中数字列的偏度。以下代码中使用的应用函数返回 NULL。但是,当我直接对任何列使用该函数时,它 returns 值。

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

请指出上面代码中的错误。提前致谢!

发生的事情是 apply 强制转换为矩阵并将数字列转换为字符,因此您的函数 returns NULL

尝试

sapply(a,funNum)

这将遍历 a 的列而不强制转换为矩阵

是的,我在评论中的猜测是正确的:你有因素!

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() 在这种情况下没有任何关系,因为列的 none 是数字(所以你得到 NULL)。

如果使用sapply()lapply(),情况就不同了。这些功能旨在与列表/数据框一起使用。您将获得所有数字列的有效结果。

是使用sapply()还是lapply()取决于你想要什么。 sapply() returns 一个向量/矩阵,而 lapply() returns 一个列表(默认情况下)。我估计 skewness() 只是 returns 一个标量结果,所以建议使用 sapply(),这样你就可以得到一个向量。如果您想要数据框,请改用 as.data.frame(lapply(Glass, skewness))