我有一个名为“insurance”的数据框,其中包含数字变量和因子变量。如何选择所有因子变量以便检查分类变量的水平?
我试图sapply(insurance,class)
获取所有变量的类。但是我无法根据 if 进行逻辑论证,class(var)="factor"
因为变量名也包含在sapply()
.
谢谢,
我有一个名为“insurance”的数据框,其中包含数字变量和因子变量。如何选择所有因子变量以便检查分类变量的水平?
我试图sapply(insurance,class)
获取所有变量的类。但是我无法根据 if 进行逻辑论证,class(var)="factor"
因为变量名也包含在sapply()
.
谢谢,
一些数据:
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)
作为一个简短的摘要,您可能还会觉得有趣。
这(几乎)似乎是使用很少使用的功能 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))
insurance %>% select_if(~class(.) == 'factor')
我建议在这里使用 dplyr 和 purrr。首先选择因子列,然后使用 purrr::map 显示每列的因子水平。
library(tidyverse)
insurance %>%
select(where(is.factor)) %>%
map(levels)
使用来自 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