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.framelappy
可能更合适,因为它至少更接近于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"