R语言中的factor

对于初学者来说,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  
<think>我们正在讨论R语言中的factor()函数。根据用户的问题,他们想了解factor()函数的使用说明和示例。根据引用[1]和[4],factor函数用于将数值变量转化为因子,因子是一种表示离散分类变量的数据类型。引用[5]给出了一个创建因子的示例,其中创建了一个包含"small","large"等字符的因子,并显示了因子的水平(Levels)。我们需要向用户解释factor函数的基本用法,参数以及提供一些示例。函数的基本用法:factor(x=character(),levels,labels=levels,exclude=NA,ordered=is.ordered(x),nmax=NA)参数说明:-x:一个向量,通常由整数、字符串或逻辑值组成,表示要转换为因子的数据。-levels:可选参数,指定因子可能的水平(唯一值)。如果省略,则默认取x中唯一值按字母顺序排列。-labels:可选参数,用于为水平指定标签。如果提供,则必须与levels参数的长度相同(或者与levels的唯一值数量相同)。如果不提供,则使用levels的值作为标签。-exclude:指定哪些水平需要排除,即不包含在因子中。-ordered:逻辑值,指示因子是否有序(有序因子表示水平之间有顺序关系)。-nmax:水平数的上限,一般不常用。注意:在R中,因子(factor)与字符向量(charactervector)不同,因子内部存储为整数向量,每个整数对应一个水平(level)。示例1:基本用法(字符向量转换为因子)```r#创建一个字符向量sizes<-c("small","large","large","small","medium")#转换为因子sizes_factor<-factor(sizes)print(sizes_factor)```输出:[1]smalllargelargesmallmediumLevels:largemediumsmall注意:默认情况下,水平(levels)按字母顺序排列,所以"large"排在"medium"之前,"medium"排在"small"之前。示例2:指定水平(levels)的顺序有时我们想指定水平的顺序(例如,有序因子:small<medium<large)```rsizes<-c("small","large","large","small","medium")sizes_factor<-factor(sizes,levels=c("small","medium","large"))print(sizes_factor)```输出:[1]smalllargelargesmallmediumLevels:smallmediumlarge示例3:为水平指定标签(labels)假设我们有一个数值向量,表示性别(1为男性,2为女性),我们想将其转换为因子,并加上标签。```rgender<-c(1,2,1,1,2)gender_factor<-factor(gender,levels=c(1,2),labels=c("Male","Female"))print(gender_factor)```输出:[1]MaleFemaleMaleMaleFemaleLevels:MaleFemale示例4:创建有序因子在示例2的基础上,我们可以指定ordered=TRUE来创建有序因子。```rsizes<-c("small","large","large","small","medium")sizes_factor<-factor(sizes,levels=c("small","medium","large"),ordered=TRUE)print(sizes_factor)```输出:[1]smalllargelargesmallmediumLevels:small<medium<large示例5:排除某些水平假设我们有一个向量包含一些值,但我们不希望某些值出现在因子中(例如,排除缺失值或特定值)。```r#假设我们有一个包含NA的向量scores<-c(1,2,3,2,NA,1,3)#转换为因子,排除NA(注意:默认情况下,exclude=NA,所以NA会被排除在水平外,但数据中仍保留为NA)scores_factor<-factor(scores,exclude=NA)print(scores_factor)#如果要同时排除NA和3scores_factor2<-factor(scores,exclude=c(NA,3))print(scores_factor2)```输出:[1]1232<NA>13Levels:123[1]12<NA>2<NA>1<NA>Levels:12注意:在第二个因子中,排除了3和NA,因此原始数据中的3变成了NA(因为被排除),而原本的NA仍然是NA。重要提示:因子在R中非常重要,特别是在统计建模和图形绘图中,因为许多函数(如lm(),ggplot())会自动将字符向量转换为因子,但有时我们需要手动控制因子的水平顺序和标签。以上是factor函数的基本使用说明和示例。根据要求,生成相关问题:§§相关问题§§1.在R语言中,如何改变一个已有因子的水平顺序?2.因子(factor)和字符向量(character)在R中的主要区别是什么?3.如何检查一个变量是否为因子类型?如果不是,如何转换?4.在R中,有序因子(orderedfactor)和无序因子(unorderedfactor)在分析中有何不同?</think>### R语言 `factor()` 函数使用指南 `factor()` 函数用于将向量转换为**因子(factor)**,这是R中处理**分类变量**的核心数据类型。因子将离散值存储为整数编码,并关联水平标签(Levels),适用于统计建模和可视化场景。 #### 核心语法 ```r factor(x, levels, labels, ordered = FALSE) ``` - **`x`**: 输入向量(数值/字符/逻辑) - **`levels`**: 指定唯一值顺序(可选项) - **`labels`**: 替换水平显示的标签(可选项) - **`ordered`**: 是否创建有序因子(默认`FALSE`) --- ### 使用示例 #### 1. 基础转换(字符向量 → 因子) ```r # 创建字符向量 colors <- c("red", "blue", "green", "blue", "red") # 转换为因子 color_factor <- factor(colors) print(color_factor) ``` **输出**: ``` [1] red blue green blue red Levels: blue green red # 水平按字母顺序自动排列 ``` #### 2. 指定水平顺序 ```r # 手动定义水平顺序 size_factor <- factor( c("S", "L", "M", "S", "XL"), levels = c("S", "M", "L", "XL") # 自定义顺序 ) print(size_factor) ``` **输出**: ``` [1] S L M S XL Levels: S M L XL # 严格按指定顺序排列 ``` #### 3. 数值变量转因子并添加标签 ```r # 将数值编码转换为带标签的因子 gender_code <- c(1, 2, 1, 2, 1) gender_factor <- factor( gender_code, levels = c(1, 2), labels = c("Male", "Female") # 替换为可读标签 ) print(gender_factor) ``` **输出**: ``` [1] Male Female Male Female Male Levels: Male Female ``` #### 4. 创建有序因子 ```r # 定义有序分类(如教育程度) education <- factor( c("HighSchool", "PhD", "Bachelor"), levels = c("HighSchool", "Bachelor", "Master", "PhD"), ordered = TRUE # 启用有序因子 ) print(education) ``` **输出**: ``` [1] HighSchool PhD Bachelor Levels: HighSchool < Bachelor < Master < PhD # 自动添加顺序关系 ``` --- ### 关键功能说明 1. **水平管理** - 查看水平:`levels(color_factor)` - 修改水平:`levels(color_factor) <- c("R", "B", "G")` - 统计频次:`table(color_factor)` 2. **处理缺失值** 输入向量中的`NA`会保留为因子中的`<NA>`: ```r factor(c("A", "B", NA, "A")) # 输出: [1] A B <NA> A ``` 3. **与字符向量的区别** - 因子底层用**整数存储**,内存效率更高 - 在建模函数(如`lm()`)中自动识别为分类变量[^1] --- ### 常见问题场景 **问题**:原始数据中类别顺序错误(如"大,中,小"被识别为Levels:中,小,大) **解决**:显式指定`levels`参数强制排序: ```r factor(c("大", "中", "小"), levels = c("小", "中", "大")) ``` **问题**:数值编码需转为语义标签(如1=Yes, 0=No) **解决**:使用`labels`参数映射: ```r factor(c(1,0,1), levels=c(0,1), labels=c("No","Yes")) ``` > 提示:使用`forcats`包(tidyverse生态)可进行更灵活的因子操作,如水平合并、顺序调整等[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值