R for data Science(十一)

第15章 因子变量

数据准备Creating factors现在你可以创建一个因子General Social SurveyModifying factor orderModifying factor levels

数据准备

要处理因子,我们将使用forcats包,它提供处理分类变量的工具(它是一个因子的组合)
它为处理因子提供了广泛的帮助。
forcats不是核心tidyverse的一部分,所以我们需要加载它

library(tidyverse)
library(forcats)

Creating factors

假设有一个记录月份的变量

x1 <- c("Dec", "Apr", "Jan", "Mar")

使用字符串记录这个变量有两个问题
1 因为有12个月,可能让你打字错误
2 它没有一个有用的分类方法
你可以用因子来解决这两个问题。要创建一个因素,你必须首先创建一个有效水平的列表:

month_levels <- c(  "Jan", "Feb", "Mar", "Apr", "May", "Jun",   "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")
现在你可以创建一个因子
y1 <- factor(x1, levels = month_levels)
y1#> [1] Dec Apr Jan Mar#> Levels: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
sort(y1)#> [1] Jan Mar Apr Dec#> Levels: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
And any values not in the set will be silently converted to NA:

有时您希望级别的顺序与数据中第一次出现的顺序相匹配。在创建因子时,您可以将级别设置为unique(x),或者在事实发生后,使用fct_inorder():

f1 <- factor(x1, levels = unique(x1))
f1#> [1] Dec Apr Jan Mar#> Levels: Dec Apr Jan Mar
f2 <- x1 %>%
 factor() %>%
 fct_inorder()
f2#> [1] Dec Apr Jan Mar#> Levels: Dec Apr Jan Mar

General Social Survey

在本节的其余部分,我们将集中讨论forcats::gss_cat。这是芝加哥大学(University of Chicago)独立研究机构NORC长期在美国进行的一项调查。该调查有数千个问题,所以在gss_cat中,我选择了一些问题,它们将说明在处理因子时将遇到的一些常见问题

Modifying factor order

在可视化中改变因子水平的顺序通常是有用的。例如,假设你想探究不同宗教每天看电视的平均时间

relig_summary <- gss_cat %>%
  group_by(relig) %>%
  summarise(    age = mean(age, na.rm = TRUE),    tvhours = mean(tvhours, na.rm = TRUE),    n = n()  )
ggplot(relig_summary, aes(tvhours, relig)) + geom_point()
image

很难解释这个图,因为没有整体的模式。我们可以通过使用fct_reorder()重新排序relig的级别来改进它。fct_reorder()主要接受两个参数:
f 即您希望修改其级别的因子。
x 一个你想用来重新排序的数字向量。

ggplot(relig_summary, aes(tvhours, fct_reorder(relig, tvhours))) +  geom_point()
image

对宗教的重新排序让我们更容易看到不了解这一类别的人看更多的电视,而印度教和其他东方宗教的人看得更少

Modifying factor levels

比改变级别的顺序更强大的是改变它们的值。最通用和最强大的工具是fct_recode()。它允许您重新编码或更改每个级别的值
例如下面,水平是简洁但是不一致的。让我们调整它们的长度,并使用一个并行结构

gss_cat %>%
  mutate(partyid = fct_recode(partyid,    "Republican, strong"    = "Strong republican",    "Republican, weak"      = "Not str republican",    "Independent, near rep" = "Ind,near rep",    "Independent, near dem" = "Ind,near dem",    "Democrat, weak"        = "Not str democrat",    "Democrat, strong"      = "Strong democrat"  )) %>% 
 count(partyid)#> # A tibble: 10 x 2#>   partyid                   n#>   <fct>                 <int>#> 1 No answer               154#> 2 Don't know                1#> 3 Other party             393#> 4 Republican, strong     2314#> 5 Republican, weak       3032#> 6 Independent, near rep  1791#> # ... with 4 more rows

要合并组,可以将多个旧级别分配到相同的新级别

gss_cat %>%
  mutate(partyid = fct_recode(partyid,    "Republican, strong"    = "Strong republican",    "Republican, weak"      = "Not str republican",    "Independent, near rep" = "Ind,near rep",    "Independent, near dem" = "Ind,near dem",    "Democrat, weak"        = "Not str democrat",    "Democrat, strong"      = "Strong democrat",    "Other"                 = "No answer",    "Other"                 = "Don't know",    "Other"                 = "Other party"  ))
 %>%  count(partyid)

#> # A tibble: 8 x 2#>   partyid                   n#>   <fct>                 <int>#> 1 Other                   548#> 2 Republican, strong     2314#> 3 Republican, weak       3032#> 4 Independent, near rep  1791#> 5 Independent            4119#> 6 Independent, near dem  2499#> # ... with 2 more rows

有时你只是想把所有的小组放在一起,使情节或表格更简单。这就是fct_lump()的工作
默认行为是逐步将最小的组聚集在一起,确保聚合仍然是最小的组。
相反,我们可以使用n参数来指定要保留的组(不包括其他组)。

gss_cat %>%
  mutate(relig = fct_lump(relig, n = 10)) %>%
  count(relig, sort = TRUE) %>%
  print(n = Inf)
#> # A tibble: 10 x 2#>    relig n#>    <fct>                  
 <int>#>  1 Protestant              
10846#>  2 Catholic       
          5124#>  3 None                     3523#>  4 Christian                 689#>  5 Other                     458#>  6 Jewish                    388#>  7 Buddhism                  147#>  8 Inter-nondenominational   109#>  9 Moslem/islam              104#> 10 Orthodox-christian         95

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,413评论 1 14
  • DATE_SUB() 函数从日期减去指定的时间间隔。DATE_SUB(date,INTERVAL expr typ...
    hello大象阅读 3,470评论 0 0
  • 青春,令人向往的季节。青春,有无尽的依恋,有无限的感慨。青春的我们,天真与活泼,充满朝气;青春的那些事儿,刻骨铭心...
    辰零阅读 293评论 1 3
  • 1、之前在web阶段,在servlet里面进行操作,那数据放到一个域对象里面,在页面中使用EL 表达式获取到,域对...
    小漫画ing阅读 206评论 0 1