查看原文
其他

R语言学习笔记(二)

从零开始 投必得学术 2022-05-07
 ↑ ↑ ↑  关注iJournal,选刊快人一步  ↑ ↑ ↑ 



导 语


之前,小编给大家介绍过R语言和Rstudio的安装(R语言学习笔记(一))。如果希望继续了解R语言的基础内容可关注“投必得医学”公众号,里面有关于R语言基本操作、数据结构、统计基础等干货内容。小编在这里作为一名非专业的R语言爱好者,给大家分享一些个人觉得非常实用的R包和作图的一些经验,希望对大家有所帮助。本期给大家带来的是dplyr这个包的介绍和基本用法。



 dplyr简介


开发这个包的是鼎鼎大名的R语言大神Hadley Wickham,他目前是Rstudio的首席科学家,除了dplyr包,还有包括ggplot2、reshape、tidyverse等应用极为广泛的R包也是他开发的。这里介绍的dplyr包主要是用来操作数据框的,概括起来主要有五大最常用的功能,包括过滤、筛选、排列、变换、汇总。大多数功能通过R的基础函数也能实现,但dplyr的强大之处就在于只要一个简单的函数就能完成,十分方便。



 安装、加载、导入数据


首先设置工作路径,安装和加载dplyr包。另外这里用到了hflights数据集,所以也需要安装和加载hflights包。hflights数据集包含了美国休斯顿两个机场所有的航班信息。

> setwd("E:/Rwork/Data_analysis") #设置工作路径>library(dplyr)> library(hflights)> data("hflights") #加载数据> dim(hflights) #查看数据大小[1] 227496 21
右滑查看更多>>


可以看到这个数据集很大,我们取一小部分数据做示例。


> flight <- hflights[1:120, 1:6]     #数据框的切片操作,表示取前6行> head(flight)                  #查看数据     Year Month DayofMonth DayOfWeek DepTime ArrTime5424 2011     1          1         6    1400    15005425 2011     1          2         7    1401    15015426 2011     1          3         1    1352    15025427 2011     1          4         2    1403    15135428 2011     1          5         3    1405    15075429 2011     1          6         4    1359    1503

右滑查看更多>>



dplyr功能实现


(1)过滤(filter)


比如这里要过滤上面flight数据集中1月1日的航班信息,我们可以先尝试用R的基本功能实现,如下:


> flights[flights$Month==1 & flights$DayofMonth==1, ]      Year Month DayofMonth DayOfWeek DepTime ArrTime5424  2011     1          1         6    1400    15006343  2011     1          1         6     728     84019266 2011     1          1         6    1631    173623655 2011     1          1         6    1756    2112

右滑查看更多>>


可以看到有4趟航班,那么用dplyr包怎么做呢:


> filter(flights, Month == 1, DayofMonth == 1) Year Month DayofMonth DayOfWeek DepTime ArrTime1 2011 1 1 6 1400 15002 2011 1 1 6 728 8403 2011 1 1 6 1631 17364 2011 1 1 6 1756 2112

右滑查看更多>>


二者结果是一致的,但filter函数的写法明显更加简洁清楚。这里需要注意的是,dplyr中的filter函数是不保留行名的,所以上述结果中数据库的行名变成了1234。另外,上述代码中两个筛选条件之间的逗号也能用”&”代替,表示需要同时满足两个条件。如果是两个条件满足其一即可,则用”|”表示。如下面的代码:
> filter(flights, DayofMonth == 1 | DayOfWeek == 2)

右滑查看更多>>


表示筛选数据集中1号或者周二出发的航班。

(2)选择(select)


选择通常是指按照列名选择特定的列,比如我们要选取Month, DayOfMonth, DayOfWeek这3列,同样我们先用R的基本功能实现:


> flights[, c("Month", "DayofMonth", "DayOfWeek")] #按列名选择> flights[, c(2,3,4)] #表示取第2、3、4列

右滑查看更多>>


用dplyr实现则更加简单:


> select(flights, Month, DayofMonth, DayOfWeek)> select(flights, c(2,3,4))

右滑查看更多>>


这里顺便提一下dplyr中的管道操作,符号是” %>%”,灵活运用能够简化代码,并且增加代码的可读性。比如我们需要选择flights数据集中的Month, DayOfMonth, DayOfWeek这3列,并且筛选出周一的航班,通常的写法是:


>filter(select(flights, Month, DayofMonth, DayOfWeek), DayOfWeek == 1)

右滑查看更多>>


这样写当然没问题,但是两个函数嵌在一起,显得不够简洁,如果加上管道符:


>flights %>% select(flights, Month, DayofMonth, DayOfWeek) %>%filter(DayOfWeek == 1)

右滑查看更多>>


虽然看起来代码量变多了,但一目了然,很容易就能读出代码在做什么。


(3)排列(arrange)


排列通常是指按照某个顺序对行进行排列,比如我们想选择flights数据集中的Month, DayOfMonth, DayOfWeek这3列,并且按照DayOfWeek进行排序。还是先用R基本功能实现:


>flights[order(flights$DayOfWeek), c(2, 3, 4)]    

右滑查看更多>>


用dplyr实现则是:
>flights %>% select(c(2, 3, 4)) %>%arrange(DayOfWeek)


若需要降序排列,则用函数”desc”:


>flights %>% select(c(2,3,4)) %>%arrange(desc(DayOfWeek))


(4)变换(mutate)


变换通常指增加一个新的变量,在数据框中表现为新增一列,比如我们需要在flights数据集中增加一列飞行时间(FliTime),数据是用到达时间(ArrTime)减去出发时间(DepTime),还是先用R基本功能实现:


> flights$FliTime <- flights$ArrTime - flights$DepTime> head(flights)Year Month DayofMonth DayOfWeek DepTime ArrTime FliTime5424 2011 1 1 6 1400 1500 1005425 2011 1 2 7 1401 1501 1005426 2011 1 3 1 1352 1502 1505427 2011 1 4 2 1403 1513 1105428 2011 1 5 3 1405 1507 1025429 2011 1 6 4 1359 1503 144

右滑查看更多>>


可以看到flights新增了一列FliTime。同样我们用dplyr实现:


>flights %>% mutate(FliTime = ArrTime - DepTime)

右滑查看更多>>


注意这样操作与上面的代码是有区别的,因为变换之后新增的列没有保存,若需要保存新增的列,则需要这样操作:


> flights <- flights %>% mutate(FliTime = ArrTime - DepTime)

右滑查看更多>>


(5)汇总(summarize)


汇总是指将数据进行归纳整理,如最简单的求极指、平均值、中位数等等。比如我们想按照周一到周天统计航班的平均飞行时间,用R基本函数实现如下:


> with(flights, tapply(FliTime, DayOfWeek, mean))       1        2        3        4        5        6        7 120.0500 107.4375 109.0000 113.5625 115.3125 120.5625 117.0500

右滑查看更多>>


如果用dplyr:


>flights %>% group_by(DayOfWeek) %>%summarise(avg_delay = mean(FliTime))


结果如下:


# A tibble: 7 x 2 DayOfWeek avg_delay <int> <dbl>1 1 120.2 2 107.3 3 109 4 4 114.5 5 115.6 6 121.7 7 117.


直接生成了一个表格,相比R中基本的tapply函数,用法更加简单,结果也更加清楚。



结语:


以上就是dplyr的基本功能了,这里小编完全是抛砖引玉,因为dplyr的强大之处完全不是上面几个简单的例子就能概括的。大家在使用中有什么问题欢迎进入投必得R语言与统计交流群,和小编一起交流R语言学习心得。


↑↑↑扫码加小编微信↑↑↑




往期好文推荐


(点击下方文字即可阅读)

R语言学习笔记(一)

常用生物学软件的安装与应用(五)— 强大的工具进行进化树的构建与美化

常用生物学软件的安装与应用(六) —Oligo7



今日视频推荐



在线文本改写或重写复杂语句,这个SCI润色工具不一般!点开视频即可了解!↑↑↑关注“投必得学术”视频号,更多干货↑↑↑

点击“阅读原文”了解投必得业务类型~
请大家点击右下角投必得分享给更多有需要的人

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存