R语言的数据管理
在进行数据分析时,常常会遇到某些情形,例如我要挑出满足某一条的行,我要挑出某些列。此时可以使用dplyr
包,或SQL操作。
dplyr
包的操作
dplyr
包的安装
|
|
数据集
现在使用datasets
包中的ChickWeight
数据集,如下所示:
|
|
从上面结果可以看出来,ChickWeight含有4个变量,分别为数值型变量weight,数值型变量Time,因子型变量Chick,因子型变量Diet。
tibble数据类型
tibble是R语言中一个用来替换data.frame类型的扩展的数据框,tibble继承了data.frame,是弱类型的,同时与data.frame有相同的语法,使用起来更方便。tibble对data.frame做了重新的设计:
|
|
这里再注明一下,tibble这个包是包含在tidyverse项目中的,tidyverse是一组处理与可视化R包的集合,其中包含以下的包:
|
|
计数count
dplyr包中的count函数可以进行计数,用法为count(x, ..., wt = NULL, sort = FALSE)
,其中x
是目标数据集,...
是数据集中的变量,如下所示:
|
|
从上面的结果我们可以看出来,输出的结果是一个tibble,其中它与data.frame不同的地方在于,它会在行名称的下面再加一行,就上面的结果而言,它添加了一行为<fct>, <int>
的信息,指明了不同列的类型,其它的数据类型信息如下所示:
|
|
汇总summaryise()
summaryise(),用法为summarise(.data, ...)
,其中.data
是数据集,...
是需要汇总的函数,用法如下所示
|
|
分组group_by
group_by
,用法为group_by(.data, ..., add = FALSE)
,其中.data
是数据集,...
是分组对象,如下所示:
|
|
group_by可以和summarise连用,如下所示:
|
|
筛选filter
filter()
函数,用法为filter(.data, ...)
。举例说明,如下所示:
挑选出weight大于等于40的数据,如下所示:
|
|
挑选出weight大于等于40,并且Time大于等于2的数据,如下所示:
|
|
挑选出Diet为1的数据,如下所示:
|
|
操行出Diet为1或3的数据,此时需要使用%in%
符号,如下所示:
|
|
挑选出Chick为2,Diet为1的数据,如下所示:
|
|
挑选满足条件的某一列select
filter在使用时,它是将满足某一条件的整个数据集都给拿了出来,而select函数则是只将某一列拿出来,例如我们现在只将weight和Diet挑选出来,并与filter对比一下,如下所示:
|
|
排列某一列,只选择剩下的部分,如下所示:
|
|
除去某2列,如下所示:
|
|
选择从Time到Diet这之间的列,如下所示:
|
|
添加mutate
mutate()
可以添加不同的列,现在我们在原始数据后面加上一列,名称是Diff,列的内容是该行weight值与weight均值之差,如下所示:
|
|
管道命令%in%
%in%
是dplyr的管道命令,可以将几个函数串联起来。看下面的案例:
|
|
结果如下所示:
|
|
再看一案例,如下所示:
|
|
运行结果如下所示:
|
|
排序arrange
arrange()
可以将数据集进行排序,用法如下所示:
|
|
sqldf
包的操作
sqldf
包提供了使用SQL操作数据框的方式,通常这种操作非常适合那些有数据库背景的人使用。
安装sqldf
包
|
|
sqldf包的使用
我们使用learningr
包中的deer_endocranial_volume
数据集来演示一下sqldf的操作,如下所示:
|
|
运行结果如下所示:
|
|
现在挑选出VolCt大于400,或者是VolCT2大于400的行。
我们先用R语言来操作,如下所示:
|
|
运行结果如下所示:
|
|
现在使用sqldf包来操作,如下所示:
|
|
运行结果如下所示:
|
|
具体的SQL语法可以参考专业的SQL书籍。
数据的合并
R中与合并有关的函数包括:
|
|
构建原始数据
|
|
数据如下所示:
|
|
横向合并cbind()
cbind()
函数是横向合并,也就是按column进行合并,即左右合并,如下所示:
|
|
结果如下所示:
|
|
纵向合并rbind()
rbind()
是按row进行合并,即纵向合并,在进行纵向合并时,两个数据框要有相同的列,如下所示:
|
|
数据如下所示:
|
|
此时按列进行合并,即使用rbind()
函数进行合并,如下所示:
|
|
合并后的结果如下所示:
|
|
按照某字段进行合并merge()
merge()
函数主要是针对横向的列字段进行合并,而且可以针对主字段进行匹配,如果主字段名称不同,还可以指定前后相匹配的字段,使用语法如下所示:
|
|
具体的参数为:
x
:数据框1;y
:数据框2;by
:连接的列名,默认是intersect(names(x),names(y))
;by.x
第一个数据框要连接的列名,默认是by
;by.y
第二个数据框要连接的名,默认是by
;all
:如果连接后没有这一行记录,是否要包含此行,默认是FALSE;all.x
:如果连接后第一个数据框中没有这一行的记录,是否要包含此行,默认是all;all.y
:如果连接后第一个数据框中没有这一行的记录,是否要包含此行,默认是all。
列名相同的merge()
原始数据如下所示:
|
|
数据为:
|
|
从上面结果可以看出来,student1
和student2
中都有相同的列ID
,按此列进行合并,如下所示:
|
|
如果两具数据框中有相同的列,by
参数可以省略,如下所示:
|
|
横向合并
先创建一个原始数据集,如下所示:
|
|
数据如下所示:
|
|
从上面的两个数据框,authors
和books
可知,它们有1列属性相同,也就是authors
中的surname
列和books
中的name
列,都是字符串,但是名称不同,因此,在使用merge()
进行合并时,需要指定匹配的主字段。
内部连接
此时,我们按照authors
的surname
列和books
的name
列进行合并,如下所示:
|
|
合并后的数据如下所示:
|
|
从上面可以看出来,合并的时候,只合并了authors
和books
的交集。
左连接
|
|
合并后的数据如下所示:
|
|
从上面可以看出来,内部连接与左连接合并的效果是相同的,使用==
判断一下,也是如此:
|
|
右连接
|
|
合并后的数据框如下所示:
|
|
右连接合并后的,取是的并集。
外连接
|
|
合并后的数据如下所示:
|
|
外连接与右连接相同,判断一下:
|
|
使用dplyr
包进行合并
先创建一个原始数据,如下所示:
|
|
数据如下所示:
|
|
inner_join(x,y)
:只包含同时出现在x和y数据框中的行:
|
|
left_join(x, y)
:包含所有x中以及y中匹配的行
|
|
left_join(x,y)
包含所有y中以及x中匹配的行
|
|
full_join(x,y)
:包含所有x、y中的行
|
|
semi_join(x, y) :包含x中,在y中有匹配的行,结果为x的子集
|
|
anti_join(x, y) :包含x中,不匹配y的行,结果为x的子集,与semi_join相反
|
|
参考资料
- 时光加速器-dplyr.李楠 克里克学苑
- R语言数据科学新类型tibble
- 学习R.[美] Richard,Cotton 著刘军 译
- manipular-tablas.R
- 数据追加与合并