dplyr是R中用来进行数据操作的一个包,由Hadley Wickham(男神!)编写维护。它提供了一些功能强大,易于使用的函数,这些函数对于数据探索分析和数据操作而言非常实用。在本文中我将对这些常用函数做一个基本的概述。
我将使用包中自带的空气质量数据集做示例。这个数据集包含了纽约从1973年5月到1973年9月的空气质量测量数据。
head(airquality) Ozone Solar.R Wind Temp Month Day 1 41 190 7.4 67 5 1 2 36 118 8.0 72 5 2 3 12 149 12.6 74 5 3 4 18 313 11.5 62 5 4 5 NA NA 14.3 56 5 5 6 28 NA 14.9 66 5 6
library(datasets) library(dplyr)
filter()函数会返回满足设定条件的观测数据(行),举个例子,我们可以用如下方法返回Temp变量值大于70的观测:
filter(airquality, Temp > 70) Ozone Solar.R Wind Temp Month Day 1 36 118 8.0 72 5 2 2 12 149 12.6 74 5 3 3 7 NA 6.9 74 5 11 4 11 320 16.6 73 5 22 5 45 252 14.9 81 5 29 6 115 223 5.7 79 5 30 ...
filter(airquality, Temp > 80 & Month > 5) Ozone Solar.R Wind Temp Month Day 1 NA 186 9.2 84 6 4 2 NA 220 8.6 85 6 5 3 29 127 9.7 82 6 7 4 NA 273 6.9 87 6 8 5 71 291 13.8 90 6 9 6 39 323 11.5 87 6 10 ...
Mutate()函数可以给数据集添加新变量。比如,可以在表中添加新的一列,记录用摄氏度表示的温度数据。
mutate(airquality, TempInC = (Temp - 32) * 5 / 9) Ozone Solar.R Wind Temp Month Day TempInC 1 41 190 7.4 67 5 1 19.44444 2 36 118 8.0 72 5 2 22.22222 3 12 149 12.6 74 5 3 23.33333 4 18 313 11.5 62 5 4 16.66667 5 NA NA 14.3 56 5 5 13.33333 ...
summarise()是用来将多个变量总结成单个变量的函数。将它和dplyr包中的其他函数组合使用可谓威力无穷。如下所示,na.rm=TRUE设置会在计算均值时剔除所有NA的观测,防止返回异常结果。
summarise(airquality, mean(Temp, na.rm = TRUE)) mean(Temp) 1 77.88235
group_by()函数可以把数据集根据一个或多个变量进行分组。比如可以根据月份把数据分组,并用summarise()函数计算每个组的温度均值。
summarise(group_by(airquality, Month), mean(Temp, na.rm = TRUE)) Month mean(Temp) 1 5 65.54839 2 6 79.10000 3 7 83.90323 4 8 83.96774 5 9 76.90000
sample()函数可以从表格中随机抽取一定数量的行(观测)。下述第一行代码从数据集中随机抽取了10行,第二行代码随机抽取了15行(153个观测的10%)。
sample_n(airquality, size = 10) sample_frac(airquality, size = 0.1)
count(airquality, Month) Month n 1 5 31 2 6 30 3 7 31 4 8 31 5 9 30
arrange()函数可以按照变量值对观测进行排序。当前情况下,空气质量数据集是按照月份(Month)进行排序,每个月的数据在按照日期(Day)排序。我们可以用arrange函数将数据集按照月份降序排列,再逐月按照日期升序排列。
arrange(airquality, desc(Month), Day) Ozone Solar.R Wind Temp Month Day 1 96 167 6.9 91 9 1 2 78 197 5.1 92 9 2 3 73 183 2.8 93 9 3 4 91 189 4.6 93 9 4 5 47 95 7.4 87 9 5 6 32 92 15.5 84 9 6
R中的管道操作符为%>%,这个符号可以把一系列操作函数链接起来。(译者注:管道操作符%>%会将不同指令连接起来。%>%符号会把左边的输出传递到右边的函数,作为右侧函数的第一个参数。)当你对一个数据集进行连续操作时利用管道操作符非常有用,它可以让你不用逐步记录每一次操作的输出。
举个例子,如果我们想要移除数据集中5月份的观测,并将观测按月份排序,再机选每个月的平均温度。传统的方法可能要把代码写成这样:
filteredData <- filter(airquality, Month != 5) groupedData <- group_by(filteredData, Month) summarise(groupedData, mean(Temp, na.rm = TRUE))
airquality %>% filter(Month != 5) %>% group_by(Month) %>% summarise(mean(Temp, na.rm = TRUE))
这是一个非常基础的例子,管道操作的便利性可能无法体现。但只要对于数据的操作数越来越多,管道操作的优势将会逐步体现。
到这里本文就要结束了。我希望你们能享受阅读的过程,并且认为dplyr包真的实用。如果你有任何问题,请在下方自由留言或访问我的 推特 。