R,class()为数据框列返回不同的结果

时间:2016-01-16 10:31:07

标签: r

> bb = data.frame(x = c( 11:13), y = c(1:3), z = c("a", "a", "b"))
> bb
   x y z
1 11 1 a
2 12 2 a
3 13 3 b
> 
> apply( bb, 2, class)
          x           y           z 
"character" "character" "character" 
>
> apply( bb[,1:2], 2, class)
        x         y 
"integer" "integer" 
>    
> apply( bb[,2:3], 2, class)
          y           z 
"character" "character" 
> 
> class(bb$z)
[1] "factor"
> 

我很惊讶地发现上面说明的class()行为。有人可以给出任何上述不一致的理由。非常感谢。

1 个答案:

答案 0 :(得分:2)

原因是apply将所有内容转换为character类,因为它将其转换为matrixmatrix只能包含一个类,即如果至少有一个类列是非数字的,整个数据集更改为character。相反,我们可以使用,

lapply(bb, class)
#$x
#[1] "integer"

#$y
#[1] "integer"

#$z
#[1] "factor"

以上返回list的输出。如果我们需要vector,请使用sapply

sapply(bb, class)

vapply(bb, class, '')

您也可以使用str()检查数据框

str(bb)
# 'data.frame': 3 obs. of  3 variables:
#  $ x: int  11 12 13
#  $ y: int  1 2 3
#  $ z: Factor w/ 2 levels "a","b": 1 1 2

由于OP在帖子中显示,只要它只是数字列,就会显示正确的类apply,直到混合中添加了非数字列。