有人可以解释一下数据框的列apply()
和如何sapply()
操作之间的区别吗?
例如,当尝试在数据框中查找每个列的类时,我的第一个倾向是apply
在这些列上使用:
> apply(iris, 2, class)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
"character" "character" "character" "character" "character"
但是,由于某些列是数字列,因此这是不正确的:
> class(iris$Petal.Length)
[1] "numeric"
在Google上进行的快速搜索找到了此解决方案,该解决方案使用sapply
而不是apply
:
> sapply(iris, class)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
"numeric" "numeric" "numeric" "numeric" "factor"
在这种情况下,sapply
将隐式转换iris
为列表,然后将该函数应用于列表中的每个条目,例如:
> class(as.list(iris)$Petal.Length)
[1] "numeric"
我仍然不清楚的是为什么我最初的尝试apply
没有奏效。
似乎经常是这样,我在编写问题的过程中就找到了问题的答案。如果其他人有相同的问题,请在此处发布答案。
详细了解?apply
状态:
如果“ X”不是数组,而是具有非空“ dim”值的类的对象(例如数据框),则“ apply”会尝试通过“ as.matrix”将其强制到数组二维(例如,数据框)或通过“ as.array”。
因此,就像在操作之前sapply
将数据帧转换为一样,将数据帧转换为也是。由于矩阵不能具有混合类型,并且至少有一列包含非数字数据(),因此所有内容都变为字符数据:list
apply
matrix
Species
> class(as.matrix(iris)[,'Petal.Length'])
[1] "character"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句