R语言中的factor

摘要:
对于初学者来说,R语言中的factor有些难以理解。我倾向于不要翻译,就称其为factor,然后从几个例子中理解:[html]viewplaincopydata˂-cdata显示结果:[html]viewplaincopy[1]1223123312331然后运行:[html]viewplaincopyfdata˂-factorfdata显示结果:[html]viewplaincopy[1]1223123312331Levels:123继续查看class[html]viewplaincopyclass[1]"factor"class[1]"numeric"可以看到,factor()函数将原来的数值型的向量转化为了factor类型。factor类型的向量中有Levels的概念。Levels就是factor中的所有元素的集合。因为factor是一种更高效的数据存储方式。因此,read.table()函数会默认把读取的数据以factor格式存储,除非你指定类型。

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

  1. <spanstyle="font-size:12px;">data<-c(1,2,2,3,1,2,3,3,1,2,3,3,1)
  2. data
  3. </span>

显示结果:

  1. <spanstyle="font-size:12px;">[1]1223123312331</span>

然后运行:

  1. <spanstyle="font-size:12px;">fdata<-factor(data)
  2. fdata</span>

显示结果:

  1. <spanstyle="font-size:12px;">[1]1223123312331
  2. Levels:123</span>

继续查看class

  1. <spanstyle="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。

  1. <spanstyle="font-size:12px;">levels(fdata)
  2. [1]"1""2""3"</span>

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

  1. <spanstyle="font-size:12px;">rdata<-factor(data,labels=c("I","II","III"))
  2. rdata
  3. </span>

显示结果:

  1. <spanstyle="font-size:12px;">[1]IIIIIIIIIIIIIIIIIIIIIIIIIII
  2. Levels:IIIIII</span>

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

  1. <spanstyle="font-size:12px;">rdata<-factor(data,labels=c("e","ee","eee"))
  2. rdata
  3. </span>

显示结果:

  1. <spanstyle="font-size:12px;">[1]eeeeeeeeeeeeeeeeeeeeeeeeeee
  2. Levels:eeeeee</span>

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

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

  1. <spanstyle="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><pretabindex="0"class="GCWXI2KCJKB"id="rstudio_console_output"style="font-family:'LucidaConsole';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-0px;background-color:rgb(255,255,255);"><prename="code"class="html"><spanstyle="font-size:12px;">mons<-factor(mons)
  2. </span><prename="code"class="html"><spanstyle="font-size:12px;">table(mons)
  3. </span>

显示结果:

  1. <spanstyle="font-size:12px;">mons
  2. AprilAugustDecemberFebruaryJanuaryJulyMarchMayNovember
  3. 241231115
  4. OctoberSeptember
  5. 13</span>

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

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

现在运行:

  1. table(mons)
  2. mons
  3. JanuaryFebruaryMarchAprilMayJune
  4. 321210
  5. JulyAugustSeptemberOctoberNovemberDecember
  6. 143151

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

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

转化后:

  1. mean(factor(fert))
  2. Warningmessage:
  3. Inmean.default(factor(fert)):参数不是数值也不是逻辑值:回覆NA

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

  1. mean(as.numeric(factor(fert)))
  2. [1]1.888889

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

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

免责声明:文章转载自《R语言中的factor》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇显示文件的16进制编码(C++)C#数据类型转换下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux下PHP自动生成文章预览图,html转换成各种格式图片、PDF-----转自phpboy的文章

原文地址:http://www.phpboy.net/linux/575.html 用WordPress建立博客站点,选择了一套可以显示文章缩略图的模板,几经折腾将原有模板改得面目全非,最后还是直接上线吧,不想折腾了。 站点上线没几天,在公司做项目时,对图片做了一个放大的JS,自己博客也加上点击缩略图查看原图的功能,然后迅速的加了。 过了几天,突发奇想,想...

Scrapy进阶知识点总结(二)——选择器Selectors

1. Selectors选择器 在抓取网页时,您需要执行的最常见任务是从HTML源提取数据。有几个库可用于实现此目的,例如: BeautifulSoup是Python程序员中非常流行的Web抓取库,它基于HTML代码的结构构造Python对象,并且相当好地处理坏标记,但它有一个缺点:它很慢。 lxml是一个XML解析库(也可以解析HTML),它使用基于E...

Node.JS + MongoDB技术浅谈

看到一个Node.JS + MongoDB的小例子,分享给大家,魔乐科技软件学院(www.mldnjava.cn)的讲座 Node.JS + MongoDB技术讲座          云计算 +大数据 = 未来。          在中国的云计算上基本上是一个概念,个人感觉与当初的SOA没有太大的区别,空泛的理论。          中小型开发的未来...

vw和rem的根字号大小设置CSS代码

html { font-size: 16px; } @media screen and (min-375px) { html { /*iPhone6的375px尺寸作为16px基准,414px正好18px大小, 600 20px */font-size: calc(100% + 2 * (100vw - 375px) /...

使用swiper.js实现移动端tab切换

在项目中遇到的,要实现tab切换,我用的是swiper.js 官网:http://www.swiper.com.cn/api/start/new.html 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta charset="UTF-...

R语言数据集合并、数据增减、不等长合并

数据选取与简单操作: which 返回一个向量中指定元素的索引 which.max 返回最大元素的索引 which.min 返回最小元素的索引 sample 随机在向量中抽取元素 subset 根据条件选取元素 sort 升序排列元素 rev 反转所有元素 order 获取排序后的索引 table 返回频数表...