【问题标题】:apply() not working when checking column class in a data.frame检查data.frame中的列类时apply()不起作用
【发布时间】:2015-05-25 02:17:55
【问题描述】:

我有一个数据框。我想检查每一列的class

x1 = rep(1:4, times=5)
x2 = factor(rep(letters[1:4], times=5))
xdat = data.frame(x1, x2)

> class(xdat)
[1] "data.frame"
> class(xdat$x1)
[1] "integer"
> class(xdat$x2)
[1] "factor"

但是,假设我有很多列,因此需要使用 apply() 来帮助我解决问题。但它不起作用。

apply(xdat, 2, class)
         x1          x2 
"character" "character" 

为什么我不能使用apply() 来查看每一列的数据类型?或者我应该怎么做?

谢谢!

【问题讨论】:

    标签: r class apply


    【解决方案1】:

    你可以使用

    sapply(xdat, class)
    #     x1        x2 
    # "integer"  "factor" 
    

    使用apply 会将输出强制转换为matrix,并且矩阵只能包含一个“类”。如果有“字符”列,则结果将是单个“字符”类。了解这个检查

     str(apply(xdat, 2, I))
     #chr [1:20, 1:2] "1" "2" "3" "4" "1" "2" "3" "4" "1" ...
     #- attr(*, "dimnames")=List of 2
     # ..$ : NULL
     # ..$ : chr [1:2] "x1" "x2"
    

    现在,如果我们检查一下

     str(lapply(xdat, I))
     #List of 2
     #$ x1:Class 'AsIs'  int [1:20] 1 2 3 4 1 2 3 4 1 2 ...
     #$ x2: Factor w/ 4 levels "a","b","c","d": 1 2 3 4 1 2 3 4 1 2 ...
    

    【讨论】:

    • 谢谢!我忘了强制的事情。好久没用R了;这样的菜鸟错误。
    • @JasonV,谢谢,除了apply,即rapply(xdat, class); vapply(xdat, class, character(1L)),大多数基于*apply 的解决方案都有效
    • 哦,其实我不知道rapply
    • 其核心是“使用 apply 会将输出强制转换为矩阵,并且矩阵只能包含一个‘类’。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多