如何选择R中的所有因子变量

时间:2013-07-28 11:55:24

标签: r

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

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

谢谢,

5 个答案:

答案 0 :(得分:14)

一些数据:

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)有趣的简短摘要。

答案 1 :(得分:1)

这(几乎)似乎是使用很少使用的功能的最佳时机

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))

答案 2 :(得分:0)

insurance %>% select_if(~class(.) == 'factor')

答案 3 :(得分:0)

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

library(tidyverse)

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

答案 4 :(得分:-2)

使用flodel中的数据框“insurance”来一次性获取所有因子,您可以使用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