【问题标题】:Why does apply() return incorrect column types?为什么 apply() 返回不正确的列类型?
【发布时间】:2015-12-25 00:28:41
【问题描述】:

我最近开始使用 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 

发生了什么事?

【问题讨论】:

标签: r apply


【解决方案1】:

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

如果X 不是数组而是具有非空dim 值的类的对象(例如数据框),apply 会尝试通过as.matrix 将其强制转换为数组,如果它是两个维度(例如,数据框)或通过as.array

is.array(iris)
# [1] FALSE

所以你有它。在强制转换之后,这些列实际上都变成了字符,因为矩阵只能采用一种数据类型(请参阅as.matrix(iris))。 help(as.matrix)Details 部分讨论了整个事情被强制转换为字符而不是其他数据类型的原因。

正如 Pascal 所说,您应该使用 sapply()

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

或者更高效的vapply()

vapply(iris, is.numeric, NA)

【讨论】:

    猜你喜欢
    • 2019-03-30
    • 2013-02-14
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 2011-08-06
    • 2013-03-08
    • 2014-04-02
    • 1970-01-01
    相关资源
    最近更新 更多