购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.5 R包

使用R语言进行数据分析时,需要对已有数据进行处理,优化数据的结构,规范数据的格式,方便后续的数据分析工作。R语言自带的基础数据处理方法不够简洁易记,且在处理大量数据时速度太慢,面对复杂需求时需要执行的操作太过烦琐或无法达成。因此,本节主要介绍几个可以高效处理数据的R包,包括dplyr包,tidyr包,这些包在运行速度、代码简洁度及功能上相比R语言自带的基础数据处理方法有着较大提升,若能熟练掌握,可以成为处理数据的一大利器。

1.5.1 dplyr包

dplyr包主要用于数据清洗和整理,该包专注dataframe数据格式,可以大幅提高数据处理速度,第1.5.1节将使用R语言自带的数据集mtcars对dplyr包的使用方法及相关函数进行展示。

首先安装dplyr包及准备数据,在利用dplyr包处理数据之前,需要将数据装载成dplyr包的一个特定对象类型(tbl_df),可以用 tbl_df函数实现该过程:

1.筛选

filter()函数可以按给定的逻辑判断筛选出符合要求的子数据集,例如筛选出数据集mtcars_df中mpg的值为21,hp的值为110的所有数据:

筛选mpg值大于20或hp值大于100的所有数据:

2.排列

arrange()函数可以按给定的列名依次对数据集的行进行排序,默认为升序排列,在列名前加desc可实现倒序排序,例如,对数据集按照disp列排序:

优先按照gear降序,gear相同时按disp升序:

3.选择

select()函数可以用列名作为参数选择子数据集,如选择从cyl到vs的所有列:

选择mpg,hp,gear三列数据:

4.变形

mutate()函数可以对已有列进行数据运算,例如在数据集的末尾加一列表示数据的编号:

将disp列的数据除以25并添加为新的列new_disp:

5.汇总

summarise()函数对数据框调用其他函数进行汇总操作,并返回操作结果,如计算qsec列的平均值:

6.分组

group_by()函数可以对数据进行分组,当对数据集通过group_by()添加了分组信息后,mutate()函数,arrange()函数和 summarise()函数会自动对这些tbl类数据执行分组操作。例如,对数据集按照cyl分组,并且计算每组元素的数量:

对数据集按照gear分组,并计算每组中wt的平均值:

7.连接符%>%

连接符是dplyr包中的一个非常实用的功能,它可以支持将所有操作步骤写在一起,不储存中间结果,连接符左边操作的结果直接作为右边操作的输入。使用连接符时,最开始的输入为数据集。例如,对数据集按照gear分组,并计算每组中wt的平均值,然后按wt平均值的降序排列:

1.5.2 tidyr包

tidyr包用于数据处理,可以实现数据长格式和宽格式之间的相互转换,这里所指的长格式数据就是一个观测对象由多行组成,而宽格式数据则是一个观测对象仅由一行组成。除此之外,tidyr包还可以对数据进行拆分和合并,同时也能够对缺失值进行简单的处理。第1.5.2节将以学生成绩表为例展示tidyr包中部分函数的用法,首先构建学生成绩表:

1.宽表转长表

gather()函数可以实现宽表转长表,语法如下:

其中,data表示需要被转换的宽表,key表示将原数据框中的所有列赋给一个新变量key,value表示将原数据框中的所有值赋给一个新变量value,…指定哪些列聚到同一列中,na.rm表示是否删除缺失值,convert表示是否对key列数据进行类型转换(主要用于数值数据类型),factor_key表示是否将key列的数据存储为因子型。例如,将学生成绩表进行宽表转长表:

2.长表转宽表

spread()函数可以实现长表转宽表,语法如下:

其中:data为需要被转换的长表;key为原数据框中需要扩展的列;value为原数据框中需要分散的值;fill表示对长表转宽表后的缺失值进行填充,默认填充NA,例如fill=10,则对长表转宽表后的所有的缺失值填充为10;convert表示是否对key列数据进行类型转换,默认不转换;drop表示是否保留原数据中未显示的因子级别,默认不保留;sep表示将新列的名称改为"<key_name><sep><key_value>"的形式,默认为不改动。例如,将学生成绩表进行长表转宽表:

3.合并

unite()函数可以将数据框中多列合并为一列,语法如下:

其中:data为需要被操作的数据;col为新合并列的名字;…为需要被合并的列;sep为合并时使用的连接符,默认为“-”;remove表示是否删除被合并的列,默认删除;na.rm表示是否删除缺失值,默认不删除。例如,将学生的所有成绩合成一列,并用“-”号连接:

4.拆分

separate()函数可将一列拆分为多列,其语法如下:

其中:data为需要被操作的数据;col为需要被拆分的列;into为新建的列;sep为被拆分列的分隔符,若为数字则表示被拆分的位置;remove表示是否删除被拆分的列,默认删除;convert表示是否对拆分后的数据进行类型转换,默认不转换;extra的值代表对拆分片段过多情形的处理方式,默认的warn表示发出警告并删除额外值;fill的值代表拆分片段过少情形的处理方式,默认的warn表示发出警告并用右侧的值填充。例如,将合并后的学生成绩表拆分:

将合并后的学生成绩表从all_grade列的第2、4、5处拆分:

由以上结果可以看出,若拆分位置为3个,则原数据会被拆分成4段,由于只定义了3列,因此第四段数据会丢失,在使用数字确定拆分位置时需要注意拆分位置数量与拆分目标段数之间的关系。 3GHIY2RmISeyUBC433uja0D3e3Fu4VzJaz9Ch14fxN6c58GmblNZDGUGWnuie2FJ

点击中间区域
呼出菜单
上一章
目录
下一章
×