【发布时间】:2013-07-28 07:02:02
【问题描述】:
我有一个名为“insurance”的数据框,其中包含数字变量和因子变量。如何选择所有因子变量以便检查分类变量的水平?
我尝试sapply(insurance,class) 来获取所有变量的类。但是我不能根据class(var)="factor" 的逻辑论证,因为变量名也包含在sapply() 的结果中。
谢谢,
【问题讨论】:
标签: r
我有一个名为“insurance”的数据框,其中包含数字变量和因子变量。如何选择所有因子变量以便检查分类变量的水平?
我尝试sapply(insurance,class) 来获取所有变量的类。但是我不能根据class(var)="factor" 的逻辑论证,因为变量名也包含在sapply() 的结果中。
谢谢,
【问题讨论】:
标签: r
一些数据:
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) 作为简短摘要很有趣。
【讨论】:
使用来自 flodel 的数据框“保险”一次性获取所有因素,您可以使用 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
【讨论】:
apply。它将它的第一个参数强制为一个矩阵,这里是一个字符矩阵。因子信息丢失。
apply 的问题可能会导致按照我建议的方式使用它。我鼓励大家在投票时添加简短评论而不是“就这样做”,毕竟这不是个人的,深思熟虑的 cmets 可以添加尽可能多的内容知识作为正确答案向社区提供。
这(几乎)似乎是使用很少使用的函数 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)
【讨论】: