应用返回 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))
。
我正在尝试查找数据框中数字列的偏度。以下代码中使用的应用函数返回 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))
。