R语言中的因子型变量

因子与因子水平

R语言的数据类型中,因子(Factor)型比较特殊,也让许多初学者感到难以理解。其实就像整型用来存储整数、字符型用来存储字符或字符串类似,因子型是用来存储类别的数据类型,因子型变量因此是离散变量。

eg:五个用户月均通话次数分别是(15, 1, 63, 19, 122),存储在变量calls_num中。此时calls_num是一个数值型变量,有五个值,且理论上每个值的取值范围是0到+∞。如果想将这个变量进行离散化,根据[0,10] , (10,100] ,(100,+∞]将次数划分为低频、中频、高频三个类别,这时便可建立一个因子型变量f_calls_num记录每个用户月均通话次数所在类别,即(中频,低频,中频,中频,高频)。

因子水平(Level)表示因子的值域,因子的每个元素只能取因子水平中的值或缺失。上例中,因子水平就是(低频,中频,高频)。

R语言实现

  • 创建因子

R语言中,通过factor()函数建立因子型变量。

> calls_num<-c(15,1,63,19,122)
> calls_num
[1]  15   1  63  19 122
> class(calls_num)
[1] "numeric"
> f_calls_num<-factor(calls_num)
> f_calls_num
[1] 15  1   63  19  122
Levels: 1 15 19 63 122
>class(f_calls_num)
[1] "factor"

其中,class()函数用来检测变量类别。可以看出,calls_num为数字型,经过转化后,f_calls_num变为因子型。Levels表示因子水平。这里还需要注意的一点是,R默认创建数据框时,将文本类型存储为因子型。如果想取消此操作,可在data.frame函数或read.csv函数中设置stringAsFactors=F参数。

  • 因子水平

可通过levels()函数输出因子水平。

> levels(f_calls_num)
[1] "1"   "15"  "19"  "63"  "122"
> class(levels(f_calls_num))
[1] "character"

通过上面的例子可以发现,levels的元素都是character类型,可以通过as.character()函数将因子型转化为字符型。

通过设置factor函数中的参数,可以修改因子水平。

> f_calls_num<-factor(calls_num,labels=
c('a','b','c','d','e'),ordered=TRUE)
> f_calls_num
[1] b a d c e
Levels: a < b < c < d < e
#levels(f_calls_num)<-c('a','b','c','d','e')
#f_calls_num<-ordered(f_calls_num)

labels表示对因子水平重命名,ordered=TRUE表示建立有序分类。可以用注释部分代码实现相同的效果。

删除多余因子水平

在实际应用中,会出现实际取值范围小于因子水平。为了满足特定的运算或提升存储效率,可以使用droplevels()函数删除多余因子水平。

levels(f_calls_num)<-c('a','b','c','d','e','f')
> f_calls_num
[1] b a d c eLevels: a b c d e f
> droplevels(f_calls_num)
[1] b a d c eLevels: a b c d e
连续数据分组

我们前面讲的例子中,要根据次数大小对数据进行离散化分组,此时可通过cut()函数实现。

> f_calls_num2<-cut(calls_num, breaks = c(0, 10,  100,Inf),
labels = c('dipin','zhongpin','gaopin'),include.lowest = T,ordered_result = T) 
> f_calls_num2
[1] zhongpin dipin    zhongpin zhongpin gaopin  
Levels: dipin < zhongpin < gaopin

优点

1、节约存储空间。随硬件能力的提升,人们现在不太关注用因子型来提高存储效率,但R保留了这个方式。

2、因子型变量为离散变量,可通过定义因子型变量区分离散变量。

本文分享自微信公众号 - 机器学习养成记(chenchenwings)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据文摘

R语言有多强大?十个你不知道的功能

R语言的确提供了很全面的统计分析的软件包,比如CRAN,Bioconductor,Neuroconductor,以及ROpenSci;并且提供了优秀的包管理功能...

10530
来自专栏生信技能树

重复一篇Cell文献的PCA图

这天,接到了生信技能树创始人jimmy老师的一个任务,要重复一篇CELL文章中的一个图示:

25510
来自专栏零维领域

线性代数--MIT18.06(三)

,我们依然可以使用矩阵消元的形式来求解,只不过要比我们之前提到的矩阵消元多做一些消元而已,这就是Gauss-Jordan法。

6630
来自专栏帮你学MatLab

mapping toolbox (2)

gb = geobubble(tsunamis.Latitude,tsunamis.Longitude,...

11020
来自专栏机器学习与统计学

统计学公开课大盘点

统计学博大精深,用途广泛,是一门非常重要的基础课程。在接触了一些统计学公开课后,发现网络上还有很多的免费的在线统计学课程可以用来学习和复习相关的知识点,只是缺乏...

73440
来自专栏新智元

Facebook最新论文:跨语言模型预训练,三大任务刷新最高性能

最近的研究已经证明,生成式预训练对于英语自然语言理解很有效。但该领域的研究基本上都是单语的,主要集中在英语。

13910
来自专栏Rainbond开源「容器云平台」

敲黑板 | 云帮储存那点事儿

正常安装环境下云帮需要一个分布式文件系统,社区版默认使用NFS作为共享存储,如果你的环境中有分布式文件存储系统,需要使用dc-ctl set storage -...

10110
来自专栏计算机视觉战队

性能大幅度提升(速度&遮挡) | 基于区域分解&集成的目标检测

最近杭州天空终于有太阳了,心情都好起来了。真正的春天到来了,为了消除春困,有兴趣的可以和我们一起探讨下接下来讲述的技术框架,主要涉及深度学习及目标检测领域,那就...

19240

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励