如何找出data.frame的类别

时间:2018-10-25 07:01:50

标签: r class

我有一个简单的问题,使我今天早上很奇怪。如何获得显示数据框列类的向量?

当我计算出这个值时,我认为它应该起作用,但是没有作用。我对结果更加惊讶,不明白结果。

这是我的例子:

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" 

3 个答案:

答案 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"