专栏首页庄闪闪的R语言手册[R数据科学]tidyverse数据清洗案例详解

[R数据科学]tidyverse数据清洗案例详解

介绍

本中你将学习在R中数据处理简洁的方法,称为tidy data。将数据转换为这种格式需要一些前期工作,但这些工作从长远来看是值得的。一旦你有了整洁的数据和一些包提供的整洁工具,您将花费很少时间将数据从一种表示转换到另一种,从而可以将更多的时间花在分析问题上。

本文将为您提供整理数据的实用介绍以及tidyr包中附带的工具。如果你想了解更多的基本理论,你可能会喜欢发表在《统计软件杂志》上的tidy data论文[1]

本文框架

数据清洗案例

我们主要通过一个案例,来了解如何整洁数据,并将案例中的各个有用函数进行详细解读。该例子来自《R for data science》[2],案例数据来自tidyr::who,其包含按年份,国家,年龄,性别和诊断方法细分的结核病(TB)病例。数据来自2014年世界卫生组织《全球结核病报告》[3]

library(tidyverse) #加载包
who #数据展示

这是一个非常典型的现实示例数据集。它包含冗余列,奇数变量代码和许多缺失值。我们需要采取多个步骤来对其进行整理。

不是变量的列汇集在一起

首先将不是变量的列聚集在一起。所包含的列包括:

  • countryiso2iso3是三个指定国家/地区的变量。
  • year是一个变量。
  • 变量名中给出的结构(例如new_sp_m014new_ep_m014new_ep_f014)可能是值,而不是变量。

因此,我们需要将从new_sp_m014newrel_f65的所有列汇总在一起。我们用通用名称"key"来表示他们。我们知道单元格代表案件数,因此我们将变量数存储在cases中,并用na.rm去除含有缺失值的行。这里使用pivot_longer()将数据变长,具体见后面函数详情。

who1 <- who %>%
	pivot_longer(
		cols = new_sp_m014:newrel_f65,
		names_to = 'key',
		values_to = 'cases',
		values_drop_na = T
)

who1

key进行计数,我们可以得到一些有关值结构的提示:

who1 %>% count(key)

其中key的具体含义,查阅可得:

  1. 每列的前三个字母:新、旧病例。
  2. 之后两个字母:结核的类型。
  • rel 代表复发病例
  • ep 代表肺外结核病例
  • sn 代表无法通过肺部涂片诊断(涂片阴性)的肺结核病例
  • sp 代表可被诊断为肺部涂片(涂片阳性)的肺结核病例
  1. 第六字母:结核病患者的性别。男性(m)和女性(f
  2. 其余数字给出了年龄段。数据集将案例分为七个年龄组:
  • 014 = 0 – 14岁
  • 1524 = 15 – 24岁
  • 2534 = 25 – 34岁
  • 3544 = 35 – 44岁
  • 4554 = 45 – 54岁
  • 5564 = 55 – 64岁
  • 65 = 65岁或以上

替换数据

我们需要对列名称的格式进行较小的修正:将new_rel替换为newrel(很难在这里找到它,但是如果您不修正它,我们将在后续步骤中出错)。这里使用了stringr包中的str_replace(),将newrel替换new_rel

who2 <- who1 %>%
	mutate( names_from = stringr::str_replace(key,'newrel','new_rel')
	)
who2

字符分割

接下来就是将key中的字符进行分割,我们使用separate()对字符进行两次分割。

1.将在每个下划线处拆分代码。

who3 <- who2 %>%
	separate(key,c('new','type','sexage'),sep = '_')
who3

利用select()删除没用的列:new,iso2,iso3

who3 %>% count(new)
who4 <- who3 %>% select(-new,-iso2,-iso3)
who4
  1. 将分离sexagesexage通过的第一个字符后拆分:
who5 <- who4 %>%
	separate(sexage,c('sex','age'),sep=1)
who5

这时,who数据集整洁!

可视化

数据清洗完毕,就可以做一些初步的可视化,探索性分析.这里简单绘制了 前几个国家不同年份,不同性别的结核病病例总数。

who5 %>% group_by(country,year,sex)  %>% filter(year<2003) %>%
	count() %>%
	head(100) %>%
	ggplot(aes(x=as.factor(year),y=n,fill=country))+geom_col() +facet_wrap(~sex,nrow = 1)+
	  scale_fill_brewer(palette = "Paired")

复杂的管道函数

事实上你可以直接只用管道函数构建一个复杂的函数,这样做去除了中间变量,而且可读性很强,强烈推荐。

who %>%
  pivot_longer(
    cols = new_sp_m014:newrel_f65,
    names_to = "key",
    values_to = "cases",
    values_drop_na = TRUE
  ) %>%
  mutate(
    key = stringr::str_replace(key, "newrel", "new_rel")
  ) %>%
  separate(key, c("new", "var", "sexage")) %>%
  select(-new, -iso2, -iso3) %>%
  separate(sexage, c("sex", "age"), sep = 1)

所用函数详细解释

pivot_longer()、poivot_wider()

pivot_longer() 将在列中列名(数值)转换到一列上。具体可见下图,将列变量转化为数据存在year列名中,相当于把数据变长(longer).

函数主要参数:

  • cols选取的列;
  • names_to 字符串,指定要从数据的列名中存储的数据创建的列的名称。
  • values_to 字符串,指定要从存储在单元格值中的数据创建的列的名称。
  • values_drop_na 如果为真,将删除value_to列中只包含NAs的行。

例子如上面例子:将new_sp_m014newrel_f65之间的列选取,汇总到key列名中,值存在cases列名中,并将含有缺失值的行进行删除。

who1 <- who %>%
	pivot_longer(
		cols = new_sp_m014:newrel_f65,
		names_to = 'key',
		values_to = 'cases',
		values_drop_na = T
)

当然还有一个和它相反功能的函数poivot_wider()。具体见下图,相当于把key中的值变为列名,对应的values数据转化到population中.下面是简单的例子。

library(tidyverse)
stocks <- tibble(
  year   = c(2015, 2015, 2016, 2016),
  half  = c(   1,    2,     1,    2),
  return = c(1.88, 0.59, 0.92, 0.17)
)
stocks

我们将数据变宽,将year变为列名,对应在return中的数据进行填充。

stocks %>%
	pivot_wider(names_from = year,values_from = return)

separate()

该函数可将字符进行分割,具体案例如上.

默认情况下,当separate()看到非字母数字字符(即不是数字或字母的字符)时,它将分割值。可以用里面的参数sep。比如:sep='_'。他还有一个功能,当sep=2时,可通过第二个位置进行分割,使用在省份市级,等数据上。例如以下函数,其中into = c("century", "year")将原始分割后的数据导入两个新列上,分别叫centuryyear

table3 %>% 
  separate(year, into = c("century", "year"), sep = 2)

注意:默认情况下,会转化成字符形式,你可以用参数convert=T,将数据转化最佳结构。

unite

separate()的反函数,这里做个补充。

默认情况下,sep='_'如果我们不需要任何分隔符可以使用sep=''

参考资料

[1]

tidy data论文: http://www.jstatsoft.org/v59/i10/paper

[2]

《R for data science》: https://r4ds.had.co.nz/tidy-data.html

[3]

《全球结核病报告》: http://www.who.int/tb/country/data/download/en/

本文分享自微信公众号 - 庄闪闪的R语言手册(Zss_R4ds),作者:庄闪闪

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 用最酷的方法学习R语言

    这里推荐几本线上的电子书,作者都在不断的更新,网页版的电子书,copy代码无障碍,无广告,很流畅。

    邓飞
  • 推荐5本R语言入门学习的在线参考书~用最酷的方法学习R语言

    前几天去新疆培训,制作了R语言的基础教程,在翻阅资料时,看到了知乎张敬信关于R学习的观点,很是赞同。

    用户7010445
  • R入门?从Tidyverse学起!

    很多人推荐《R语言实战》这本书来入门R,当然,这本书非常不错,我也是通过这本书开始接触的R。这种入门的学习路径属于base R first,学习的流程基本是先了...

    阿凡亮
  • R用于研究,Python用于生产

    原文:R is for Research, Python is for Production

    郭好奇同学
  • R语言进阶笔记1 | 深挖一门语言的必要性

    作为专业人员,要不断的学习新事物,多多读书思考,克服浮躁情绪,才可以让自己的内心清澈如池水。不断的注入活水(新知识),才能滋润心灵焕发神采,才能达到比较高的境界...

    邓飞
  • Hadley Wickham 采访节选(一)

    Hadley (羞涩脸):“那总比别人叫他们 Hadley-verse好吧!” ╮(╯▽╰)╭

    用户7652506
  • R语言数据清洗实战——高效list解析方案

    list是R语言中包容性最强的数据对象,几乎可以容乃所有的其他数据类型。 但是包容性最强也也意味着他对于内部子对象的类型限制最少,甚至内部可以存在递归结构,这样...

    数据小磨坊
  • R语言数据清洗实战——世界濒危遗产地数据爬取案例

    最近重复新翻阅R语言领域唯一一本关于网络数据采集的参考书——《基于R语言的自动数据收集》,开篇就是一个数据爬取的案例。 尽管之前已经粗略的看过一遍,但是仍感书中...

    数据小磨坊
  • 精品教学案例 | 金融贷款数据的清洗

    本案例适合作为大数据专业数据清洗或Pandas数据分析课程的配套教学案例。通过本案例,能够达到以下教学效果:

    数据酷客
  • Python代码实操:详解数据清洗

    在缺失值的处理上,主要配合使用 sklearn.preprocessing 中的Imputer类、Pandas和Numpy。其中由于Pandas对于数据探索、分...

    华章科技
  • 如何用R和API免费获取Web数据?

    API是获得Web数据的重要途径之一。想不想了解如何用R调用API,提取和整理你需要的免费Web数据呢?本文一步步为你详尽展示操作流程。

    王树义
  • 还在为自学数据科学发愁吗?化学工程毕业生教你如何转行

    作为一名最近毕业于化学工程专业的学生,我第一份工作是在一家科技公司担任数据分析师。我曾在这里记录了从化学工程到数据科学的转变。从那时起,每当我与学校的学生谈论这...

    大数据文摘
  • tidyverse:R语言中相当于python中pandas+matplotlib的存在

    tidyverse就是Hadley Wickham将自己所写的包整理成了一整套数据处理的方法,包括ggplot2、dplyr、tidyr、readr、purrr...

    拴小林
  • 独家 | 浅谈Python/Pandas中管道的用法

    我是R语言的忠实粉丝,并且靠它吃饭。特别提一下Tidyverse,它是一个功能强大、简洁易懂且文档齐全的数据科学平台。我在此向每一位初学者强烈推荐免费的在线电子...

    数据派THU
  • R语言数据清洗实战——复杂数据结构与list解析

    数据清洗从来都不是一件简单的事情! 使用httr包结合浏览器抓包工具进行网页数据抓取虽然非常方便,但是获取的数据后期处理工作量却非常庞大的。 因为大部分json...

    数据小磨坊
  • Tidyverse|数据列的分分合合,一分多,多合一

    比如基因列为ID的需要转为常见的symbol,基因列为symbol|ID的就需要拆开了!

    西游东行
  • 给数据科学家的10个提示和技巧Vol.4

    原文:10 Tips And Tricks For Data Scientists Vol.4[1]

    庄闪闪
  • 【好书共享】《R for Data Science》的中译版

    这本书将教我们如何用R来做数据科学:学习如何将自己的数据导入R中,把它变成最有用的结构,转换,可视化并对数据进行建模。在这本书中,我们会学习数据科学需要实用技能...

    生信技能树
  • 手把手教你用R处理常见的数据清洗问题(附步骤解析、R语言代码)

    R是进行运算、清洗、汇总及生成概率统计等数据处理的一个绝佳选择。此外,由于它独立于平台、短期内不会消失,所以生成的程序可以在任何地方运行。并且,它具备非常棒的辅...

    数据派THU

扫码关注云+社区

领取腾讯云代金券