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

16
我有一个名为 "insurance" 的数据框,其中包含数值和因子变量。如何选择所有因子变量以便检查分类变量的级别?
我尝试使用 sapply(insurance,class) 来获取所有变量的类别。但是由于变量名称也包含在 sapply() 的结果中,所以我无法基于逻辑参数确定是否为 class(var)="factor"
谢谢,
5个回答

21

一些数据:

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
这似乎是使用很少用到的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))

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

6
你好 - 这可能解决了原帖的问题,但如果能说明为什么可以解决原贴的问题会更有用。解释有助于人们学习 :) - MyStackRunnethOver

2

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

library(tidyverse)

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

-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

3
我不是第一个点踩的人,但加负面评价的原因是要阻止你在不适当的情况下使用apply。它会把第一个参数强制转换为矩阵,在这里是字符矩阵。因子信息会丢失。 - IRTFM
2
DWin,感谢您留下带有负面评价的评论。我之前并不知道使用我建议的方式可能会导致“apply”出现问题。我鼓励每个人在给出负面评价时添加简短的评论,而不是“只是这样做”,毕竟这并不是个人问题,周到的评论可以为社区增加与正确答案同等的知识。 - hvollmeier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接