R for data Science (11章)

作者: 一路向前_莫问前程_前程似锦 | 来源:发表于2018-12-05 16:03 被阅读25次

使用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
image.png

如果想要显示错误信息,那么你可以使用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
image.png

如果想要直接访问因子的有效水平集合,那么可以使用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)

相关文章

网友评论

    本文标题:R for data Science (11章)

    本文链接:https://www.haomeiwen.com/subject/eleicqtx.html