【问题标题】:How to find out the classes of a data.frame [duplicate]如何找出data.frame的类[重复]
【发布时间】:2018-10-25 07:01:50
【问题描述】:

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

当我计算这个时,我认为它应该可以工作,但它没有。我对结果更加惊讶,也不明白结果。

这是我的例子:

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" 

【问题讨论】:

  • 好的,谢谢 sapply 的作品。我只是想知道这个应用调用中的字符表达式来自哪里。但就目前而言,它有效。
  • 我把我的评论变成了答案,因为我可能知道为什么会这样 - 得到了新答案的批准。

标签: r class


【解决方案1】:

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" 

【讨论】:

    【解决方案2】:

    我实际上无法详细解释它,但您可以尝试sapply(Example, class) 以获得您正在寻找的正确向量。 sapply 用于数据帧,这就是它起作用的原因。您也可以使用lapply(Example, class),但您必须将获得的列表转换为向量。这也有效,因为基本上数据框只是数据框的列表。

    apply 不起作用,因为它旨在用于矩阵。由于矩阵总是来自同一类型的数据,apply 必须给你“字符”作为答案。这是因为一旦给定矩阵(或给定向量)中有一个字符,每个数字也会转换为字符。这就是apply 不起作用的原因。

    【讨论】:

      【解决方案3】:

      您可以尝试对数据框的每一列进行循环

      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" 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多