为什么apply()返回不正确的列类型?

时间:2015-12-25 00:28:42

标签: r apply

我最近开始使用R而apply()功能正在绊倒我。我很感激这方面的帮助:

is.numeric(iris$Sepal.Length) # returns TRUE
is.numeric(iris$Sepal.Width)  # returns TRUE
is.numeric(iris$Petal.Length) # returns TRUE
is.numeric(iris$Petal.Width)  # returns TRUE

但是,

apply(iris, 2, FUN = is.numeric) 

返回

Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
       FALSE        FALSE        FALSE        FALSE        FALSE 

发生了什么事?

1 个答案:

答案 0 :(得分:8)

它们都是FALSE因为apply()在应用iris函数之前将is.numeric()强制转换为矩阵。从help(apply)关于第一个参数X -

  

如果X不是数组而是具有非空昏暗值的类的对象(例如数据框),apply会尝试通过{{1}将其强制转换为数组如果它是二维的(例如,数据帧)或通过as.matrix

as.array

所以你有它。实际上,这些列在强制之后都变成了字符,因为矩阵只能采用一种数据类型(参见is.array(iris) # [1] FALSE )。 as.matrix(iris)详细信息部分讨论了整个事物被强制转换为字符而不是某些其他数据类型的原因。

正如Pascal所说,你应该使用help(as.matrix)

sapply()

或稍高效sapply(iris, is.numeric) # Sepal.Length Sepal.Width Petal.Length Petal.Width Species # TRUE TRUE TRUE TRUE FALSE

vapply()