> 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()行为。有人可以给出任何上述不一致的理由。非常感谢。
答案 0 :(得分:2)
原因是apply
将所有内容转换为character
类,因为它将其转换为matrix
而matrix
只能包含一个类,即如果至少有一个类列是非数字的,整个数据集更改为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
,直到混合中添加了非数字列。