数据-R语言-图表-决策-Linux-Python

R for data Science (11章)

2018-12-05  本文已影响25人  一路向前_莫问前程_前程似锦

使用forcats处理因子

准备工作

我们将使用forcats包来处理因子,这个包提供了能够处理的分类变量(其实就是因子的另一种说法)的工具,其中还包括了处理因子的大量辅助函数。

library(forcats)
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)
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)
上一篇 下一篇

猜你喜欢

热点阅读