【问题标题】:How to select all factor variables in R如何在R中选择所有因子变量
【发布时间】:2013-07-28 07:02:02
【问题描述】:

我有一个名为“insurance”的数据框,其中包含数字变量和因子变量。如何选择所有因子变量以便检查分类变量的水平?

我尝试sapply(insurance,class) 来获取所有变量的类。但是我不能根据class(var)="factor" 的逻辑论证,因为变量名也包含在sapply() 的结果中。

谢谢,

【问题讨论】:

    标签: r


    【解决方案1】:

    一些数据:

    insurance <- data.frame(
      int   = 1:5,
      fact1 = letters[1:5],
      fact2 = factor(1:5),
      fact3 = LETTERS[3:7]
    )
    

    我会像你一样使用sapply,但结合is.factor返回一个逻辑向量:

    is.fact <- sapply(insurance, is.factor)
    #   int fact1 fact2 fact3 
    # FALSE  TRUE  TRUE  TRUE
    

    然后使用[ 提取这些列:

    factors.df <- insurance[, is.fact]
    #   fact1 fact2 fact3
    # 1     a     1     C
    # 2     b     2     D
    # 3     c     3     E
    # 4     d     4     F
    # 5     e     5     G
    

    最后,要获得关卡,请使用lapply

    lapply(factors.df, levels)
    # $fact1
    # [1] "a" "b" "c" "d" "e"
    # 
    # $fact2
    # [1] "1" "2" "3" "4" "5"
    # 
    # $fact3
    # [1] "C" "D" "E" "F" "G"
    

    您可能还会发现 str(insurance) 作为简短摘要很有趣。

    【讨论】:

      【解决方案2】:

      使用来自 flodel 的数据框“保险”一次性获取所有因素,您可以使用 apply ,如下所示:

      apply(insurance,2,factor)
      
           int fact1 fact2 fact3
      [1,] "1" "a"   "1"   "C"  
      [2,] "2" "b"   "2"   "D"  
      [3,] "3" "c"   "3"   "E"  
      [4,] "4" "d"   "4"   "F"  
      [5,] "5" "e"   "5"   "G"  
      

      如果您只对一个因素的水平感兴趣,您可以执行以下操作:

      factor(insurance$fact1)
      
      [1] a b c d e
      Levels: a b c d e
      

      【讨论】:

      • 我不是第一个投反对票的人,但是添加负面的原因是为了阻止您在不合适的情况下使用apply。它将它的第一个参数强制为一个矩阵,这里是一个字符矩阵。因子信息丢失。
      • DWin,感谢您对不赞成票发表评论。我不知道apply 的问题可能会导致按照我建议的方式使用它。我鼓励大家在投票时添加简短评论而不是“就这样做”,毕竟这不是个人的,深思熟虑的 cmets 可以添加尽可能多的内容知识作为正确答案向社区提供。
      【解决方案3】:

      这(几乎)似乎是使用很少使用的函数 rapply 的最佳时机

      rapply(insurance, class = "factor", f = levels, how = "list")
      

      或者

      Filter(Negate(is.null),rapply(insurance, class = "factor", f = levels, how = "list"))
      

      删除NULL 元素(不是因素)

      或者干脆

      lapply(Filter(is.factor,insurance), levels))
      

      【讨论】:

        【解决方案4】:
        insurance %>% select_if(~class(.) == 'factor')
        

        【讨论】:

        • 您好 - 这可能会解决 OP 的问题,但如果它说 为什么 它解决了 OP 的问题会更有用。解释帮助人们学习:)
        【解决方案5】:

        我建议在这里使用 dplyr 和 purrr。首先选择因子列,然后使用 purrr::map 显示每列的因子水平。

        library(tidyverse)
        
        insurance %>%
          select(where(is.factor)) %>%
          map(levels)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-11
          • 1970-01-01
          • 1970-01-01
          • 2018-08-17
          相关资源
          最近更新 更多