【译文】利用dplyr包进行数据操作

Vivian27C 8年前
   <p> </p>    <h2>【译文】利用dplyr包进行数据操作</h2>    <h3>作者 Teja Kodali</h3>    <h3>译者 钱亦欣</h3>    <p>dplyr是R中用来进行数据操作的一个包,由Hadley Wickham(男神!)编写维护。它提供了一些功能强大,易于使用的函数,这些函数对于数据探索分析和数据操作而言非常实用。在本文中我将对这些常用函数做一个基本的概述。</p>    <p>我将使用包中自带的空气质量数据集做示例。这个数据集包含了纽约从1973年5月到1973年9月的空气质量测量数据。</p>    <h3>该数据集前几行是这样的:</h3>    <pre>  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  </pre>    <h3>在介绍函数之前,先让我们加载两个包</h3>    <pre>  library(datasets)  library(dplyr)  </pre>    <h3>准备完毕,来看看函数吧!</h3>    <h2>Filter</h2>    <p>filter()函数会返回满足设定条件的观测数据(行),举个例子,我们可以用如下方法返回Temp变量值大于70的观测:</p>    <pre>  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  ...   </pre>    <h3>也可以设置多个过滤条件。下方的例子会返回Temp大于80并且Month大于5的子集。</h3>    <pre>  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  ...  </pre>    <h2>Mutate()</h2>    <p>Mutate()函数可以给数据集添加新变量。比如,可以在表中添加新的一列,记录用摄氏度表示的温度数据。</p>    <pre>  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  ...  </pre>    <h2>Summarise</h2>    <p>summarise()是用来将多个变量总结成单个变量的函数。将它和dplyr包中的其他函数组合使用可谓威力无穷。如下所示,na.rm=TRUE设置会在计算均值时剔除所有NA的观测,防止返回异常结果。</p>    <pre>  summarise(airquality, mean(Temp, na.rm = TRUE))      mean(Temp)  1   77.88235  </pre>    <h2>Group By</h2>    <p>group_by()函数可以把数据集根据一个或多个变量进行分组。比如可以根据月份把数据分组,并用summarise()函数计算每个组的温度均值。</p>    <pre>  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  </pre>    <h2>Sample</h2>    <p>sample()函数可以从表格中随机抽取一定数量的行(观测)。下述第一行代码从数据集中随机抽取了10行,第二行代码随机抽取了15行(153个观测的10%)。</p>    <pre>  sample_n(airquality, size = 10)  sample_frac(airquality, size = 0.1)  </pre>    <h2>Count</h2>    <h3>count()函数会在数据分好组的基础上进行计数。这个函数功能和base包的table()有些类似。例子如下:</h3>    <pre>  count(airquality, Month)      Month  n  1     5 31  2     6 30  3     7 31  4     8 31  5     9 30  </pre>    <h3>输出结果表示,5月份有31个观测,6月有30个观测,等等。</h3>    <h2>Arrange</h2>    <p>arrange()函数可以按照变量值对观测进行排序。当前情况下,空气质量数据集是按照月份(Month)进行排序,每个月的数据在按照日期(Day)排序。我们可以用arrange函数将数据集按照月份降序排列,再逐月按照日期升序排列。</p>    <pre>  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  </pre>    <h2>Pipe(管道操作符)</h2>    <p>R中的管道操作符为%>%,这个符号可以把一系列操作函数链接起来。(译者注:管道操作符%>%会将不同指令连接起来。%>%符号会把左边的输出传递到右边的函数,作为右侧函数的第一个参数。)当你对一个数据集进行连续操作时利用管道操作符非常有用,它可以让你不用逐步记录每一次操作的输出。</p>    <p>举个例子,如果我们想要移除数据集中5月份的观测,并将观测按月份排序,再机选每个月的平均温度。传统的方法可能要把代码写成这样:</p>    <pre>  filteredData <- filter(airquality, Month != 5)  groupedData <- group_by(filteredData, Month)  summarise(groupedData, mean(Temp, na.rm = TRUE))  </pre>    <h3>利用管道操作符,上述代码可以重写为:</h3>    <pre>  airquality %>%       filter(Month != 5) %>%       group_by(Month) %>%       summarise(mean(Temp, na.rm = TRUE))  </pre>    <p>这是一个非常基础的例子,管道操作的便利性可能无法体现。但只要对于数据的操作数越来越多,管道操作的优势将会逐步体现。</p>    <p>到这里本文就要结束了。我希望你们能享受阅读的过程,并且认为dplyr包真的实用。如果你有任何问题,请在下方自由留言或访问我的 <a href="/misc/goto?guid=4959670877945237554" rel="nofollow,noindex">推特</a> 。</p>    <h3>注:原文刊载于datascience+网站</h3>    <h3>链接: <a href="/misc/goto?guid=4959670878033761968" rel="nofollow,noindex">http://datascienceplus.com/data-manipulation-with-dplyr/</a></h3>    <p>来自: <a href="/misc/goto?guid=4959670878112245879" rel="nofollow">http://www.ituring.com.cn/article/214094</a></p>