我有一个简单的问题,使我今天早上很奇怪。如何获得显示数据框列类的向量?
当我计算出这个值时,我认为它应该起作用,但是没有作用。我对结果更加惊讶,不明白结果。
这是我的例子:
Example = data.frame(
Col1 = c(2,5,10),
Col2 = c("Hello", "I am a", "Factor"),
Col3 = c(T,F,T))
str(Example)
# 'data.frame': 3 obs. of 3 variables:
# $ Col1: num 2 5 10
# $ Col2: Factor w/ 3 levels "Factor","Hello",..: 2 3 1
# $ Col3: logi TRUE FALSE TRUE
因此,我得到了一个数据框,其中包含一个数字列,一个因子列和一个逻辑列,并且apply函数中的class()
命令的结果为character
。谁能解释我为什么以及如何获得类的向量?
apply(Example, 2, class)
# Col1 Col2 Col3
# "character" "character" "character"
答案 0 :(得分:6)
apply
对您不起作用,因为像在文档中一样:
If ‘X’ is not an array but an object of a class with a non-null
‘dim’ value (such as a data frame), ‘apply’ attempts to coerce it
to an array via ‘as.matrix’ if it is two-dimensional (e.g., a data
frame) or via ‘as.array’.
因此您的数据框成为一个矩阵,其中列类设置为可以表示您的列的最简单的类-在这种情况下为字符矩阵:
> as.matrix(Example)
Col1 Col2 Col3
[1,] " 2" "Hello" " TRUE"
[2,] " 5" "I am a" "FALSE"
[3,] "10" "Factor" " TRUE"
使用sapply
> sapply(Example,class)
Col1 Col2 Col3
"numeric" "factor" "logical"
答案 1 :(得分:1)
我实际上无法详细解释它,但是您可以尝试sapply(Example, class)
来获取所需的正确向量。 sapply
用于数据帧,这就是它起作用的原因。您也可以使用lapply(Example, class)
,但必须将获得的列表转换为向量。这也是可行的,因为最基本的来说,数据框只是数据框的列表。
apply
不起作用,因为它只能用于矩阵。而且由于矩阵总是来自同一类型的数据,因此apply
必须给您“字符”作为答案。这是因为一旦在给定的矩阵(或给定的向量)中只有一个字符,每个数字也会转换为字符。这就是apply
无法正常工作的原因。
答案 2 :(得分:1)
您可以尝试为数据框的每一列循环
class.vec <- c()
for(c in colnames(Example)){
class.vec <- c(class.vec, class(Example[[c]]))
}
class.vec
这将返回:
> class.vec
[1] "numeric" "factor" "logical"
更“优雅”的方式是使用 sapply :
class.vec <- sapply(Example, class)
Col1 Col2 Col3
"numeric" "factor" "logical"