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

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

介绍


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


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


本文框架


(KZSC58[[[LIX1Y9VJSUICS.png


数据清洗案例


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

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

0K@`0G03OXNR8%{PA_%8]NM.png

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


不是变量的列汇集在一起

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

  • 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

2GZGM10@MLHD6W[%H](HJ4M.png


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

who1 %>% count(key)

_J$_K{UUJB7KJJLL6TS2J[R.png


其中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

_$7MGAT$2~_CUAU[`FF$~@T.png


字符分割

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

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

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

image.gif

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

who3 %>% count(new)
who4 <- who3 %>% select(-new,-iso2,-iso3)
who4

image.gif

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

DCF(}3)K})V}B$5WE{YLA$P.png

这时,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")

}Y~N6IQU289S}HB46_U0{$D.png


复杂的管道函数

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

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).

image.gif

函数主要参数:

  • 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中.下面是简单的例子。

R}`F39BDU7PU43XUI`F]97S.png

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

image.gif

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

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

1FPU71FXLB0)YKAUU@QMC%0.png


separate()

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

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

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

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

WE1@KJPJI{}ZH@N`59{SIA2.png


unite

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

(TYC3OEEM0(SQZACP]6R53E.png

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

目录
相关文章
|
6月前
|
数据采集 数据挖掘 BI
R数据科学-1(dplyr)
R数据科学-1(dplyr)
42 1
|
6月前
|
数据采集 数据可视化 大数据
Python在数据科学中的实际应用:从数据清洗到可视化的全流程解析
Python在数据科学中的实际应用:从数据清洗到可视化的全流程解析
135 1
|
1月前
|
机器学习/深度学习 并行计算 大数据
【Python篇】深入挖掘 Pandas:机器学习数据处理的高级技巧
【Python篇】深入挖掘 Pandas:机器学习数据处理的高级技巧
87 3
|
4月前
|
数据采集 存储 自然语言处理
​「Python大数据」VOC数据清洗
使用Python进行数据清洗,脚本涉及VOC数据的读取与分词。通过jieba进行中文分词,去除停用词,将清洗后的评论存入新Excel列。执行`clean.py`脚本,读取Excel文件,对每个sheet的评论内容进行处理,保留名词并移除停用词和标点,结果保存至`clean/cleaned_voc.xlsx`。关键文件包括自定义词典`luyouqi.txt`和停用词列表`stopwordsfull`。
39 0
​「Python大数据」VOC数据清洗
|
5月前
|
数据采集 数据可视化 数据挖掘
数据挖掘实战:使用Python进行数据分析与可视化
在大数据时代,Python因其强大库支持和易学性成为数据挖掘的首选语言。本文通过一个电商销售数据案例,演示如何使用Python进行数据预处理(如处理缺失值)、分析(如销售额时间趋势)和可视化(如商品类别销售条形图),揭示数据背后的模式。安装`pandas`, `numpy`, `matplotlib`, `seaborn`后,可以按照提供的代码步骤,从读取CSV到数据探索,体验Python在数据分析中的威力。这只是数据科学的入门,更多高级技术等待发掘。【6月更文挑战第14天】
512 11
|
6月前
|
数据可视化 搜索推荐 数据处理
Matplotlib在数据科学中的应用与案例分析
【4月更文挑战第17天】本文探讨了Matplotlib在数据科学中的应用,强调其作为Python中最常用的可视化库,提供多种图表类型、高度可定制性、交互式功能及与其他库的集成。通过一个案例分析展示了如何使用Matplotlib绘制城市人口分布的条形图,并添加交互式元素以增强数据探索。掌握Matplotlib能提升数据科学家的可视化能力和效率。
|
6月前
|
机器学习/深度学习 存储 算法
R语言使用特征工程泰坦尼克号数据分析应用案例
R语言使用特征工程泰坦尼克号数据分析应用案例
|
6月前
|
机器学习/深度学习 数据可视化 算法
数据分析基础:Python 与统计学
在当今数据驱动的世界中,数据分析已成为各个领域的关键技能。Python 作为一种强大的编程语言,结合了丰富的数据分析库,使其成为数据分析的首选工具之一。同时,统计学作为数据分析的理论基础,提供了一套方法来理解和解释数据。本文将介绍 Python 在数据分析中的应用,以及统计学在数据分析中的重要性。
|
数据可视化 数据挖掘 数据处理
|
数据挖掘 Python
【数据挖掘】pandas使用手册
【数据挖掘】pandas使用手册
【数据挖掘】pandas使用手册
下一篇
无影云桌面