logo

您的位置:首页 > 新闻资讯

时光加速器-dplyr

dplyr是CRAN平台上的R包,作者是Hadley Wickham。这位作者实在是程序员中的一股清流,他还有另外一个神级殿堂作品,以后我们会写到。为什么叫时光加速器呢?因为它快呀!dplyr设计的初衷就是,别人用三四行代码搞定的,我就用一行;什么这个那个函数,组合在一起;能省多少力就省多少力;绝对是懒人(我是说我自己)必备。
 
闲话少叙,下面我们来看看这个包的具体用法。由于dplyr包中的各个命令实在是太简单直白了,今天的文章就不分章节了,我们一个命令一个命令的介绍。
 
首先呢,我们当然要下载并调用dplyr包。

图片1 下载并调用dplyr包命令
 
 
为了充分展示dplyr的作用,今天我们要调用datasets包中的ChickWeight数据。datasets包是R中的默认自带包,大家不需要另外下载。

图片2 调用Datasets包并展示ChickWeight数据
 
通过ChickWeight数据的前六行我们可以看到,这项数据含有四项内容:weight(重量),Time(时间),Chick(小鸡的编号),Diet(喂食种类)。这四项内容以“列”的方式组合在一起,每一“行”是单个样本。
 
拿到数据之后,我们再看一下这四项内容的分类:

图片3 ChickWeight中四项内容的分类
 
在这个数据表中,weight和Time是数值类的数据;Chick和Diet是字符类的数据,它们指的是“组别”。数值类数据和字符类数据的处理方法不同,这是我们在之后的数据处理和分析中需要注意的。
 
以上是数据的大体情况介绍,下面看看dplyr是如何帮我们“懒懒地”工作的。在具体的讲解各项函数命令之前呢,我们要说一下dplyr系列命令的通用格式:函数名称(应用数据集,条件)。接下来几乎所有的函数都会应用到这个通用格式,大家注意观察哦。
 
 
1)数数数:count
 
count是计数命令,专门来数某一项内容的细分组里分别有多少样本。
 
听着有点拗口是吧,没关系,我们跑个命令,大家就明白啦:

图片4 count命令示例
 
这个例子中,我们要求R来数数,数什么呢?ChickWeight表中Diet这一项内容,每一个小的分组(1,2,3,4)分别有多少样本。
Count命令可以帮助我们在拿到数据之后,快速了解数据中分组及样本分布情况。使用它,我们能够立即知道样本在组间分布是否均匀,如果有样本量特别少的组,在后续工作中要注意分析方法。
 
2)总结总结总结:summarise
 
summarise是总结命令,它可以对1个或多个列进行总结(求最小值,最大值,均值等等)。
 
summarise命令中可以同步移除NA值,我们先看一个求均值的基本示例:

图片5 summarise命令求均值示例
 
下面我们来看一下,如何一步得出多个结果,这里我们用求均值和求最小值做示范:

图片6 summarise命令同时求均值和最小值
 
这里我们要提到dplyr这个包中很重要的一个点:在一个命令中可以有多个执行条件,每个条件以逗号隔开。
这个点是“懒人”程序的重要组成部分,也是dplyr系列命令区别于基础命令的重要方面,在之后的例子中我们会重复演示。
 
3)分组分组分组: group_by
 
group_by是分组命令,它可以把整个数据集按照某项内容分组。
 
我们来看一个基本示例,把ChickWeight按照Diet分组:

图片7 group_by分组命令示例
 
group_by也可以和summarise连用,举个例子:

图片8 group_by和summarise连用示例
 
通过这个例子我们知道,这两个命令连用,可以求得某项内容各个分组的均值/最大值/最小值等。
 
4) 筛筛筛: filter
 
filter命令是筛选数据内容的命令,一会儿我们要写筛选数据列的命令,大家要保持清醒,不要把它们俩弄混了。
 
Filter筛选的数据内容可以是数值(判断大小),也可以是字符(判断组别),筛选条件可以是一个,也可以是多个。接下来我们一个一个举例子。
 
首先我们看一下基本的筛选特定数值命令:

图片9 filter筛选(一项)数值示例
 
接下来,我们要利用逗号,同时设定两个筛选条件:

图片10 filter筛选(两项)数值示例
 
同样的,我们可以用filter筛选字符数据,需要大家注意的是,字符数据的是否判定用的是双等号==:

图片11 filter筛选字符数据
 
在筛选字符数据时,我们可以设定两项或多项条件,在这一情况下,逗号就不再适用了,我们需要连用集合c()和%in%,看个例子大家就明白了:

图片12 filter筛选字符数据(多项条件)
 
这是在同一个内容(Diet)下,满足两项条件(Diet=1或Diet=2)的命令。
 
那么可不可以筛选两项内容呢?
当然可以,比如ChickWeight数据集中有两项字符类数据:Chick,Diet。我们可以要求筛选出即满足Chick为2,又满足Diet为1的数据:

图片13 filter筛选字符数据(多项内容)
 
在筛选的过程中,我们可不可以把数值数据和字符数据放在一起呢?当然可以啦,依然是万能的逗号隔开不同的筛选条件:

图片14 filter筛选混合内容数据(数字和字符)
 
5)选选选:select
 
好啦,容易和filter混淆的select命令来啦。之前我们说,filter筛选的是内容,select选的是“列”。
解释一下,select命令能够选择某一列或某几列,以及排除某一列或某几列。
 
举个例子,在ChickWeight数据集中一共有4列:weight,Time,Chick,Diet。
如果我们想只要weight和Diet列应该这么做:

图片15 select选取某两列
 
大家看到,我们只需要用逗号将选取的列名隔开就可以了。
 
那么如何排除某一列,或者说如何“不选择”某一列呢?这就要用到减号-,来看个例子:

图片16 select不选择某一列
 
那么我们可不可以“不选择”两列或多列呢?当然可以呀,和正向选择一样,只需要用逗号隔开就可以了,来看个例子:

图片17 select不选择某两列
 
除了选择和排除某(几)列,我们也可以选择某一部分(从某一列到某一列),这一功能更像“摘抄”。ChickWeight里由于只有四列,看的不是很明显,如果大家手头有特别大的数据表可以试一试select的这个功能,选择数据有奇效。
我们当然也可以对ChickWeight试一试:

图片18 select选择某一段数列
 
select命令还有很多奇特的玩法,比如选择列名中含有某几个字母、列名是以哪几个字母开头或结尾等等,感兴趣的小伙伴找个超级大列表玩一玩,这里限于篇幅我们就不一个一个举例子了。
 
6)加加加:mutate
 
处理数据的时候我们时不时会遇到需要添加一列,列的内容是行中某项数据的处理结果, mutate命令可以帮助我们很方便的进行这一操作。
我们试一下在原始数据后面加上一列,列的名称是Diff,列的内容是该行weight值与weight均值之差。来看一下代码:

图片19 mutate在原始数据中添加列示例
 
经常进行方差分析、分布分析的小伙伴们要记住这个实用命令哦。
 
7)串串串:pipe%in%
 
串就是羊肉串的串,作用一模一样,只不过串起来的是“函数命令”,目的是将一系列函数连续使用,减少代码量,减少中间数据,直接得到最终运算结果。
这个函数的名称叫pipe,在R中的表达方式为%in%。请大家注意这两者是不同的,之前我们列举的六个函数都是名称与表达方式相同,但串串函数是个特例,大家记的时候要着重记R中的表达方式(%in%)。
 
Pipe函数的使用方法是,把作用对象(数据表)放在最前,用%in%把所有需要应用的函数连接在一起,最后一个函数后面不需要再写pipe命令。为了美观,可以在每个%in%后面回车,使每个函数命令单成一行。
 
我们先看一个例子:

图片20 pipe连接多组函数命令示例一
 
大家请看这个例子中,每一步都是根据上一步的结果进行运算,最后的结果是对最新的数据进行Time项的总结(求均值)。
 
利用pipe函数我们也可以对原始数据进行多步处理和加工,将其变为全新的数据集,来看这个例子:

图片21 pipe连接多组函数命令示例二
 
好啦,以上就是dplyr包中七个基础函数的使用方法。
 
总结一下,dplyr包是“方便应用”型包,主要组成不是计算类函数,而是快速加工数据的函数。dplyr包系列的命令大部分可以在一个函数内包含多个条件,各个条件之间用逗号连接;不同分类的条件可以在同一个函数中混合运用;多个函数之间可以用包内的串串函数(函数名:pipe,函数写法:%in%)连接在一起;dplyr包在处理大样本量的复杂数据时极为好用。
 
小伙伴们是不是看的很心动啊,快用手边的数据练起来呀!有问题欢迎在后台给我们留言啊,老师一激动没准就回复你了呢是不是~
 
预告:回归函数是些啥?让我们一起搞懂它!金秋九月,线性回归使用大全即将来袭,敬请期待!
 
 
 
 
 
 

最新课程

ABOUT US

克里克学院是一家致力于组织生命科学及医学领域科研及应用培训的专业机构
我们的宗旨是,打破高校壁垒,遍请天下名师!

Contact information

邮编:200000
电话:+86-21-67620569
传真:+86-21-67620569

网址:www.crickcollege.com
邮箱:marketing@crickcollege.com
地址:上海市松江区沪松公路1399弄69号717-718室

Copyright 2016 crickcollege. All rights reserved.