我有一个名为“insurance”的数据框,包含数字和因子变量。如何选择所有因子变量以便检查分类变量的级别?
我尝试sapply(insurance,class)
来获取所有变量的类。但是我不能根据if class(var)="factor"
做出逻辑论证,因为变量名也包含在sapply()
的结果中。
谢谢,
答案 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