• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

R语言中的factor

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

对于初学者来说,R语言中的factor有些难以理解。如果直译factor为“因子”,使得其更加难以理解。我倾向于不要翻译,就称其为factor,然后从几个例子中理解:

 

[html] view plain copy
 
  1. <span style="font-size:12px;">data <- c(1,2,2,3,1,2,3,3,1,2,3,3,1)  
  2. data  
  3. </span>  

显示结果:

 

 

[html] view plain copy
 
  1. <span style="font-size:12px;"> [1] 1 2 2 3 1 2 3 3 1 2 3 3 1</span>  

然后运行:

 

 

[html] view plain copy
 
  1. <span style="font-size:12px;">fdata <- factor(data)  
  2. fdata </span>  

显示结果:

 

 

[html] view plain copy
 
  1. <span style="font-size:12px;"> [1] 1 2 2 3 1 2 3 3 1 2 3 3 1  
  2. Levels: 1 2 3</span>  

继续查看class

 

 

[html] view plain copy
 
  1. <span style="font-size:12px;">class(fdata)  
  2. [1] "factor"  
  3. class(data)  
  4. [1] "numeric"</span>  

可以看到,factor()函数将原来的数值型的向量转化为了factor类型。factor类型的向量中有Levels的概念。Levels就是factor中的所有元素的集合(没有重复)。我们可以发现Levels就是factor中元素排重后且字符化的结果!因为Levels的元素都是character。

 

 

[html] view plain copy
 
  1. <span style="font-size:12px;">levels(fdata)  
  2. [1] "1" "2" "3"</span>  

我们可以在factor生成时,通过labels向量来指定levels,继续上面的程序:

 

 

[html] view plain copy
 
  1. <span style="font-size:12px;">rdata <- factor(data,labels=c("I","II","III"))  
  2. rdata  
  3. </span>  

显示结果:

 

 

[html] view plain copy
 
  1. <span style="font-size:12px;">[1] I   II  II  III I   II  III III I   II  III III I    
  2. Levels: I II III</span>  

也可以在factor生成以后通过levels函数来修改:

 

 

[html] view plain copy
 
  1. <span style="font-size:12px;">rdata <- factor(data,labels=c("e","ee","eee"))  
  2. rdata  
  3. </span>  

显示结果:

 

 

[html] view plain copy
 
  1. <span style="font-size:12px;"> [1] e   ee  ee  eee e   ee  eee eee e   ee  eee eee e    
  2. Levels: e ee eee</span>  

看到这里,我们马上就会意识到,为什么factor要有levels?因为factor是一种更高效的数据存储方式。对于不同的变量,只需要存储一次就可以,具体的数据内容只要存储相应的整数内容就可以了。因此,read.table()函数会默认把读取的数据以factor格式存储,除非你指定类型。

 

并且,factors可以指定数据的顺序:

[html] view plain copy
 
  1. <span style="font-size:12px;"> mons <- c("March","April","January","November","January", "September","October","September","November","August", "January","November","November","February","May","August", "July","December","August","August","September","November", "February","April")</span><pre tabindex="0" class="GCWXI2KCJKB" id="rstudio_console_output" style="font-family: 'Lucida Console'; font-size: 10pt !important; outline: none; border: none; word-break: break-all; margin: 0px; -webkit-user-select: text; white-space: pre-wrap !important; line-height: 15px; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: -webkit-left; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255);"><pre name="code" class="html"><span style="font-size:12px;">mons <- factor(mons)  
  2. </span><pre name="code" class="html"><span style="font-size:12px;">table(mons)  
  3. </span>  

显示结果:

[html] view plain copy
 
  1. <span style="font-size:12px;">mons  
  2.     April    August  December  February   January      July     March       May  November   
  3.         2         4         1         2         3         1         1         1         5   
  4.   October September   
  5.         1         3 </span>  

显然月份是有顺序的,我们可以为factor指定顺序

[html] view plain copy
 
  1. mons = factor(mons,levels=c("January","February","March","April","May","June","July","August","September","October","November","December"),ordered=TRUE)  

现在运行:

[html] view plain copy
 
  1. table(mons)  
  2. mons  
  3.   January  February     March     April       May      June  
  4.         3         2         1         2         1         0  
  5.      July    August September   October  November  December  
  6.         1         4         3         1         5         1  


需要注意的是数值型变量与factor的互相转化:

[html] view plain copy
 
  1. fert = c(10,20,20,50,10,20,10,50,20)  
  2. mean(fert)  
  3. [1] 23.33333  

转化后:

[html] view plain copy
 
  1. mean(factor(fert))  
  2. Warning message:  
  3. In mean.default(factor(fert)) : 参数不是数值也不是逻辑值:回覆NA  

那我们这里,是不是可以直接用as.numeric() 转化呢?

[html] view plain copy
 
  1. mean(as.numeric(factor(fert)))  
  2. [1] 1.888889  

发现上面是错误的!
这里需要这么转回去:

[html] view plain copy
 
    1. ff <- factor(fert)  
    2. mean(as.numeric(levels(ff)[ff]))  
    3. [1] 23.33333  

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
R语言学习笔记:SQL操作发布时间:2022-07-18
下一篇:
R语言入门到可视化精选19题发布时间:2022-07-18
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap