15

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

我试图sapply(insurance,class)获取所有变量的类。但是我无法根据 if 进行逻辑论证,class(var)="factor"因为变量名也包含在sapply().

谢谢,

4

5 回答 5

19

一些数据:

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)作为一个简短的摘要,您可能还会觉得有趣。

于 2013-07-28T12:09:21.863 回答
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))
于 2013-07-28T22:57:24.653 回答
2
insurance %>% select_if(~class(.) == 'factor')
于 2019-06-26T23:34:28.133 回答
1

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

library(tidyverse)

insurance %>%
  select(where(is.factor)) %>%
  map(levels)
于 2020-10-26T10:46:07.783 回答
-3

使用来自 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
于 2013-07-28T13:53:00.097 回答