R Apply函数返回NULL

R Apply函数返回NULL,r,apply,R,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 请指出上面代码中的错误。提前谢谢 发生的是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

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

发生的是
apply
强制矩阵,并将数字列转换为字符,以便函数返回NULL

试一试


这将在
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()
在这种情况下没有任何作用,因为没有一列是数字的(因此您得到了
NULL

如果使用
sapply()
lappy()
,情况就不同了。这些函数设计用于处理列表/数据帧。您将获得所有数值列的有效结果


使用
sapply()
还是
lappy()
取决于您想要什么
sapply()
尽可能返回向量/矩阵,而
lapply()
返回列表(默认情况下)。我认为
skewness()
只返回一个标量结果,因此建议使用
sapply()
,通过它可以得到一个向量。如果您想要一个数据框,请使用
as.data.frame(lapply(Glass,skewness))
来代替。

什么是
应用(a,2,is.numeric)
给您的?
应用(a,2,is.numeric)RI Na-Mg-Al-Sik-Ca-Fe-Type-FALSE
请提供一个示例。在浏览了其中至少一个链接后,请提供所使用的示例数据和代码(例如
偏度
)。请编辑您的问题,而不是添加评论,谢谢@ZheyuanLi-我只是巧妙地应用了,它给出了结果。然而,我还想了解apply不在这里工作的原因。有什么可能的解释吗?我编辑了问题中的代码以使其可复制。当我的所有列都是数字类型并返回正确的结果时,它不会强制执行。这是因为当你有一个包含所有数字的DF时,它强制执行数字矩阵也可以执行
apply(a[,1:9],2,funNum)
,这将通过省略
因子
列来避免向下转换。同意。不幸的是,两者都返回一个
矩阵
,而不是一个data.frame
lappy
可能更合适,因为它至少更接近于
data.frame
,或
data.frame
-特定功能,如
plyr
dplyr
提供的功能,但这些功能未被请求。
sapply(Glass, class)
#       RI        Na        Mg        Al        Si         K        Ca        Ba 
# "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" 
#       Fe      Type 
# "numeric"  "factor"