使用forcats处理因子
- 1 简介
因子在R中用于处理分类变量,分类变量是在固定的已知集合中取值的变量。
准备工作
我们将使用forcats包来处理因子,这个包提供了能够处理的分类变量(其实就是因子的另一种说法)的工具,其中还包括了处理因子的大量辅助函数。
library(forcats)
- 2 创建因子
假设我们想要创建一个记录月份的变量:
x1<-c("Jan","Oct","Dec","Mar","May")
使用字符串来记录月份有两个问题。
(1) 月份只有12个值,如果输入错误,代码不会有任何反应
(2)对月份进行排序没有任何意义
那我该怎么解决这个问题呢?首先我们可以通过使用因子来解决以上两个问题。要想创建一个因子,必须先创建有效水平的一个列表:
month_levels<-c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","
Dec")
那我们现在就可以创建因子了:
y1=factor(x1,levels=month_levels)
不在有效水平集合内的所有值都会自动转换为NA:
x2<-c("Jan","Oct","Dec","Mars","May")
y2=factor(x2,levels=month_levels)
y2

如果想要显示错误信息,那么你可以使用readr::parse_factor()
函数
y3=readr::parse_factor(x2,levels=month_levels)
如果省略了定义水平的步骤,那么会将按照字母顺序排列的数据作为水平:
factor(x1)
重点: 有时候,你想让因子的顺序与你的初始数据的顺序一致,就是说你想让你输入的顺序就是你的因子顺序,那么只需要在你创建因子的时候,将水平设置为unique(x)
,或者在创建因子后在对其使用fct_inorder()
函数,就可以达到这个目的。
f1=factor(x1,levels=unique(x1))
f1
f2=factor(x1)%>%fct_inorder()
f2

如果想要直接访问因子的有效水平集合,那么可以使用levels()
函数
levels(f2)
- 3 修改因子水平
在使用因子时,最常用的两种操作是修改水平的顺序和水平的值。
比修改因子水平顺序更强大的操作是修改水平的值。修改水平不仅可以使图形标签更美观清晰,以满足出版发行的要求,还可以将水平汇集成更高层次显示。修改水平最常用,最强大的工具就是fct_recode()
函数,它可以对每个水平进行修改或重新编码。例如,我们看一下
gss_cat%>%dplyr::count(partyid)
对水平的描述太过简单,而且不一致。我们将其修改为一个较为详细的排比结构,本质上就是重新给因子命名,就是rename一下
gss_cat%>%dplyr::mutate(partyid=fct_recode(partyid,
"Republican,strong" = "Strong republican",
"Republican,weak" = "Not str republican",
"Independent,near rep" = "Ind,near dem",
"Independent,near dem" = "Ind,near rep" ,
"Democrat,weak" = "Not str democrat",
"Democrat,strong" = "Strong democrat" ))%>%
dplyr::count(partyid)
fct_recode
会让没有明确的提及的水平保持原样,如果一不小心修改了一个不存在的水平,那么他就会发出警告。
你可以将多个原水平赋给同一个新水平,这样就可以实现合并原来的分类。比如:我们把“No answer”,“Don not know” 和“Other party”都归为“Other”分类
gss_cat%>%dplyr::mutate(partyid=fct_recode(partyid,
"Republican,strong" = "Strong republican",
"Republican,weak" = "Not str republican",
"Independent,near rep" = "Ind,near dem",
"Independent,near dem" = "Ind,near rep" ,
"Democrat,weak" = "Not str democrat",
"Democrat,strong" = "Strong democrat",
"Other"="No answer",
"Other"="Don't know",
"Other"="Other party"))%>%
使用这种操作要小心,如果合并了原本不同的分类,那么就会产生误导性的结果。
如果想要合并多个水平,那么可以使用fct_recode
的函数变体fct_collapse()
函数。对于每个新水平,你都可以提供一个包含原水平的向量。
gss_cat%>%dplyr::mutate(partyid=fct_collapse(partyid,
other = c("No answer","Don't know","Other party"),
rep=c("Strong republican","Not str republican"),
ind=c("Ind,near dem","Ind,near rep"),
dem=c("Not str democrat","Strong democrat")
))%>% dplyr::count(partyid)
网友评论