R中因子(factor)

在这里插入图片描述
R提供了因子这一数据结构(容器),专门用来存放名义型和有序型的分类变量。因子本质上是一个带有水平 (level) 属性的整数向量,其中“水平”是指事前确定可能取值的有限集合

直接用字符向量也可以表示分类变量,但它只有字母顺序,不能规定想要的顺序,也不能表达有序分类变量。所以,有必要把字符型的分类变量转化为因子型,这更便于对其做后续描述汇总、可视化、建模等。

1. 创建与使用因子

factor(x, levels, labels, ordered, ...)

x:为创建因子的数据向量;
levels:指定因子的各水平值,默认为 x 中不重复的所有值;
labels:设置各水平名称 (前缀) ,与水平一一对应;
因子水平标签
使用 labels 参数为每个因子水平添加标签,labels 参数的字符顺序,要和 levels 参数的字符顺序保持一致,

ordered:设置是否对因子水平排序,默认 FALSE 为无序因子, TRUE 为有序因子;
用ordered函数令他具有顺序,如果使用了这个函数,那么因子当中首先出现的level将小于后出现的level:

exclude:排除的字符。从x中剔除的水平值,默认为NA值;
nmax:水平的上限数量。
注意:不能直接将因子数据当字符型操作,需要用as.character()转化。

  1. 该函数还包含参数 exclude:指定有哪些水平是不需要的 (设为NA) ;nmax 设定水平数的上限。
  2. 若不指定参数levels,则因子水平默认按字母顺序。
  3. 注意:不能直接将因子数据当字符型操作,需要用as.character()转化。
> sex=factor(c('f','m','f','f','m'),levels=c('f','m'),labels=c('female','male'),ordered=TRUE)
> sex
[1] female male   female female male  
Levels: female < male

在上面的代码当中,向量c代表了因子当中的数据集,levels代表了我们人为设定的level,当然即使不写这个,factor函数也会自动帮我们进行设定,但是这里为了和后面的labels相对应,因此必写。labels表示我们因子创建完毕后,每个因子重新命名后的名字,因为之前在创建因子的时候为了数据的简便性就没有将其英语单词写全,ordered表示因子的level按照顺序排列,一般在R语言当中,首先在level当中出现的因子向量,这里是“f”,其顺序会优先于“m”。

因子有class属性,取值为"factor", 还有一个levels(水平值)属性, 此属性可以用levels()函数访问,

因子型是以整数向量存储的,将各水平值按照规定的顺序分别对应到整数,将原向量的各值分别用相应的整数存储,输出和使用的时候再换回对应的水平值。整数是有顺序的,这样就相当于在不改变原数据的前提下规定了顺序,同时也节省了存储空间。
在这里插入图片描述
变成因子型后,无论是排序、统计频数、绘图等,都有了顺序:

用levels()函数可以访问或修改因子的水平值(将改变数据的外在表现):

表示类别的数据称为分类数据。
成两类:男人和女人。如果从年龄上划分,又可将人群分为青年人(<-30岁),中年人(30-60岁),老年人(>60岁)。
因子被用来表示类别数据,因此也被称为“类别变量”
因子就是用于表示一组数据中的类别,可以记录这组数据中的类别名称及类别数目。
在R中使用factor函数来创建因子
在这里插入图片描述

2. 使用分类数据的意义是什么?

实现研究对象的分组、分类计算
类别数据能帮助我们自动发现错误数据

很多时候,一些模型参数都需要传入变量类型为因子。同时,绘图时候因子可以帮助你自动实现分组绘图
在这里插入图片描述
只要是列里的值是字符串的,R都会自动将该列转换为因子类型。

在这里插入图片描述

3. 类别如何排序呢?

因子的类别默认排序都是按字母顺序来排序
在这里插入图片描述

4. 因子的几个问题

1)数值类型转换成因子

直接用as.numeric转换会有问题,转换后的内容不是你想要的:
在这里插入图片描述

2)因子中 levels和lables的区别

levels代表原始类别名称,lables相当于对类别名称进行重命名。
在这里插入图片描述

2. forcats包

tidyverse系列中的 forcats包是 专门为处理因子型数据而设计的,提供了一系列操作因子的方便函数:

as_factor(): 转化为因子,默认按水平值的出现顺序
fct_count():计算因子各水平频数、占比,可按频数排序
fct_c(): 合并多个因子的水平

改变因子水平的顺序:
fct_relevel() :手动对水平值重新排序
fct_infreq(): 按高频优先排序
fct_inorder(): 按水平值出现的顺序
fct_rev(): 将顺序反转
fct_reorder(): 根据其它变量或函数结果排序 (绘图时有用)

修改水平:

fct_recode(): 对水平值逐个重编码
fct_collapse(): 推倒手动合并部分水平
fct_lump_*(): 将多个频数小的水平合并为其它
fct_other(): 将保留之外或丢弃的水平合并为其它

增加或删除水平:

fct_drop(): 删除若干水平
fct_expand: 增加若干水平
fct_explicit_na(): 为 NA设置水平

因子的索引

fc1[1] #访问输出第一个水平

fc1[1:3] #访问输出1~3个水平

fc1[c(1, 4, 7)] #访问输出第1,4,7个水平值

fc1[-1] #排除第一个

fc1[-c(1:4)] #排除第1~4个

fc1[fc1 != 1] #过滤掉等于1的因子水平

fc3[fc3 > ‘Junior’] #对于有序因子可以使用>,>=,<,<=,!=,;而非有序因子,只可以使用!=和
注意:因为因子一般表示名义变量或有序变量,如非有序因子,则使用>,>=,<,<=比较大小是没有意义的。
在这里插入图片描述

因子的修改

fc1[1] <- 3 #注意,修改的值必须在原有的水平中

fc1[1:3] <- 2 #将1~3个水平值改为2

fc1[-1] <- 3 #将除第1个水平之外的其它水平值修改为3

fc1[-c(1,4,7)] <-1 #将除第1,4,7个水平之外的值修改为1

执行情况如下:
在这里插入图片描述
修改项
要更改特定项的值,请根据索引编号:

music_genre <- factor(c("Jazz", "Rock", "Classic", "Classic", "Pop", "Jazz", "Rock", "Jazz"))
music_genre[3] <- "Pop"
music_genre[3]

结果如下:
[1] Pop
Levels: Classic Jazz Pop Rock

因子长度

使用 length() 函数找出因子中有多少项:

访问因子
要访问因子中的项,请使用 [] 括号根据索引编号:

music_genre <- factor(c("Jazz", "Rock", "Classic", "Classic", "Pop", "Jazz", "Rock", "Jazz"))
length(music_genre)

结果如下:
[1] 8
music_genre <- factor(c("Jazz", "Rock", "Classic", "Classic", "Pop", "Jazz", "Rock", "Jazz"))
music_genre[3]

结果显示为:
[1] Classic
Levels: Classic Jazz Pop Rock

利用summary函数

获取因子元素的基本情况,平均值、最大值、最小值等等

table() 函数

用 table() 函数统计因子各水平的出现次数(称为频数或频率)。也可以对一
般的向量统计每个不同元素的出现次数。对一个变量用 table 函数计数的结果是一个特殊的有元素名的向量,元素名是
自变量的不同取值,结果的元素值是对应的频数。

1.基本理论

    **1.1因子分析的基本思想**

因子分析法是从研究变量内部相关的依赖关系出发,把一些具有错综复杂关系的变量归结为少数几个综合因子的一种多变量统计分析方法。它的基本思想是将观测变量进行分类,将相关性较高,即联系比较紧密的分在同一类中,而不同类变量之间的相关性则较低,那么每一类变量实际上就代表了一个基本结构,即公共因子。对于所研究的问题就是试图用最少个数的不可测的所谓公共因子的线性函数与特殊因子之和来描述原来观测的每一分量。

R中有两种不同类型的因子变量:有序和无序。比如{小,中,大}和{钢笔,橡皮擦,铅笔}。对于绝大多数分析而言,一个因子变量是有序还是无序的不重要。如果因子是有序的,那么这个因子水平的特定次序是重要的(小<中<大)。如果因子是无序的,那么因子水平同样会以一定的顺序出现,但这仅仅为了方便而已(钢笔,橡皮擦,铅笔) - 但有时它是重要的,例如它会觉得结果如何输出,图形元素如何展示。

一种改变因子次序的方式是对因子使用factor()函数并且直接指定它们的次序。下面这个例子中,ordered()函数可以替换factor()函数。

# 创建一个错误次序的因子
sizes <- factor(c("small", "large", "large", "small", "medium"))
sizes
#> [1] small  large  large  small  medium
#> Levels: large medium small

因子水平被显式地指定:

sizes <- factor(sizes, levels = c("small", "medium", "large"))
sizes
#> [1] small  large  large  small  medium
#> Levels: small medium large

我们同样可以对有序因子这样操作:

sizes <- ordered(c("small", "large", "large", "small", "medium"))
sizes <- ordered(sizes, levels = c("small", "medium", "large"))
sizes
#> [1] small  large  large  small  medium
#> Levels: small < medium < large

另一种方式是使用relevel()函数在列表中制作一个特定水平(这对有序因子不起作用)。

# 创建错误次序的因子
sizes <- factor(c("small", "large", "large", "small", "medium"))
sizes
#> [1] small  large  large  small  medium
#> Levels: large medium small

# 使得 medium 排最前面
sizes <- relevel(sizes, "medium")
sizes
#> [1] small  large  large  small  medium
#> Levels: medium large small

# 使得 small 排最前面
sizes <- relevel(sizes, "small")
sizes
#> [1] small  large  large  small  medium
#> Levels: small medium large

当因子创建时,我们可以指定合适的顺序。

sizes <- factor(c("small", "large", "large", "small", "medium"),
                levels = c("small", "medium", "large"))
sizes
#> [1] small  large  large  small  medium
#> Levels: small medium large

反转因子水平次序。

# 创建错误次序的因子
sizes <- factor(c("small", "large", "large", "small", "medium"))
sizes
#> [1] small  large  large  small  medium
#> Levels: large medium small

sizes <- factor(sizes, levels=rev(levels(sizes)))
sizes
#> [1] small  large  large  small  medium
#> Levels: small medium large
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐