专栏首页庄闪闪的R语言手册R数据科学|3.6内容介绍

R数据科学|3.6内容介绍

上节我们对选择现有的列使用mutate添加新列做了介绍。现在对数据框使用summarize()进行分组摘要进行介绍。函数功能:summarize()可以将数据框折叠成一行:

summarize(flights, delay = mean(dep_delay, na.rm = TRUE))
#> # A tibble: 1 × 1
#> delay
#> <dbl>
#> 1 12.6

如果想要将分析单位从整个数据集更改为单个分组,可以使用group_by()group_by()summarize()的组合构成了使用 dplyr 包时最常用的操作之一:分组摘要。例如,如果对按日期分组的一个数据框应用与上面完全相同的代码,那么我们就可以得到每日平均延误时间:

by_day <- group_by(flights, year, month, day)
summarize(by_day, delay = mean(dep_delay, na.rm = TRUE))
#> Source: local data frame [365 x 4]
#> Groups: year, month [?]
#>
#> year month day delay
#> <int> <int> <int> <dbl>
#> 1 2013 1 1 11.55
#> 2 2013 1 2 13.86
#> 3 2013 1 3 10.99
#> 4 2013 1 4 8.95
#> 5 2013 1 5 5.73
#> 6 2013 1 6 7.15管道是一种强大的工具,可以清楚地表示由多个操作组成的一个操作序列。管道是一种强大的工具,可以清楚地表示由多个操作组成的一个操作序列。
#> # ... with 359 more rows

3.6.1 使用管道组合多种操作

管道(%>%) 是一种强大的工具,可以清楚地表示由多个操作组成的一个操作序列。为了说明管道如此有用的原因, 我们将探究同一段代码的不同编写方式。现在我们使用代码来讲述小兔福福的故事:

一只小兔叫福福蹦蹦跳跳过森林抓起一窝小田鼠每只头上打一下首先,我们定义一个对象来表示小兔福福:

foo_foo <- little_bunny()

然后,我们使用函数来表示每个动作:hop()scoop()bop()。 于是这首童谣可以如下表示,这种方法的最大缺点是,你必须为每个中间结果建立一个变量,在很多情况下,比如在本例中,这些变量其实是没有什么实际意义的,你还必须使用数字后缀来区分这些变量:

foo_foo_1 <- hop(foo_foo, through = forest)
foo_foo_2 <- scoop(foo_foo_1, up = field_mice)
foo_foo_3 <- bop(foo_foo_2, on = head)

另一种方法是将多个函数组合在一起,这样可以避免赋值语句,这种方法的缺点是,必须按照从内向外和从右向左的顺序阅读代码,而且参数太分散了:

bop(
 scoop(
 hop(foo_foo, through = forest),
 up = field_mice
 ),
 on = head
)

使用管道可以很好解决代码冗杂的问题,它的重点在于动词,而不是名词。在阅读这一串函数组合时,你可以将它们当成一系列规定动作。福福蹦跳着,然后抓田鼠,接着打田鼠:

foo_foo %>%
 hop(through = forest) %>%
 scoop(up = field_mouse) %>%
 bop(on = head)

掌握管道的用法后,可以显著提高代码的可读性,代码的编写也将更加容易。

3.6.2 缺失值

聚合函数遵循缺失值的一般规则:如果输入中有缺失值,那么输出也会是缺失值。好在所有聚合函数都有一个 na.rm参数,只需设置na.rm =TRUE,即可在计算前除去缺失值。

3.6.3 计数

聚合操作中常用的计数操作:

  • n():给出当前分组的个数
  • sum(!is_na()):对非缺失值的计数
  • n_distinct():计算出唯一值的数量
  • count():一个简单的辅助函数,用于只需要计数的情况

3.6.4 常用的摘要函数

  • 位置度量median(x),mean(x) 均值是总数除以个数;中位数则是这样一个值:50% 的 x 大于它,同时 50% 的 x 小于它。
  • 分散程度度量sd(x)IQR(x)mad(x) 均方误差(又称标准误差,standard deviation,sd)是分散程度的标准度量方式。四分位距IQR()和绝对中位差mad(x)基本等价,更适合有离群点的情况。
  • 秩的度量min(x)quantile(x, 0.25)max(x) 分位数是中位数的扩展。例如,quantile(x, 0.25)会找出 x 中按从小到大顺序大于前25% 而小于后75% 的值:
  • 定位度量first(x)nth(x, 2)last(x) 这几个函数的作用与 x[1]、x[2] 和 x[length(x)] 相同,只是当定位不存在时(比如尝试从只有两个元素的分组中得到第三个元素),前者允许你设置一个默认值。

3.6.5 按多个变量分组

当使用多个变量进行分组时,每次的摘要统计会用掉一个分组变量。这样就可以轻松地对数据集进行循序渐进的分析:

#统计每天的航班数
daily <- group_by(flights, year, month, day)
(per_day <- summarize(daily, flights = n()))
#> Source: local data frame [365 x 4]
#> Groups: year, month [?]
#>
#> year month day flights
#> <int> <int> <int> <int>
#> 1 2013 1 1 842
#> 2 2013 1 2 943
#> 3 2013 1 3 914
#> 4 2013 1 4 915
#> 5 2013 1 5 720
#> 6 2013 1 6 832
#> # ... with 359 more rows
#统计每月的航班数
(per_month <- summarize(per_day, flights = sum(flights)))
#> Source: local data frame [12 x 3]
#> Groups: year [?]
#>
#> year month flights
#> <int> <int> <int>
#> 1 2013 1 27004
#> 2 2013 2 24951
#> 3 2013 3 28834
#> 4 2013 4 28330
#> 5 2013 5 28796
#> 6 2013 6 28243
#> # ... with 6 more rows
#统计一年的航班数
(per_year <- summarize(per_month, flights = sum(flights)))
#> # A tibble: 1 × 2
#> year flights
#> <int> <int>
#> 1 2013 336776

注意:在循序渐进地进行摘要分析时,使用求和与计数操作是没问题的,但如果想要使用加权平均和方差的话,就要仔细考虑一下,在基于秩的统计数据(如中位数)上是无法进行这些操作的。换句话说,对分组求和的结果再求和就是对整体求和,但分组中位数的中位数可不是整体的中位数

3.6.6 取消分组

如果想要取消分组,并回到未分组的数据继续操作,那么可以使用ungroup()函数:

daily %>%
 ungroup() %>% # 不再按日期分组
 summarize(flights = n()) # 所有航班
#> # A tibble: 1 × 1
#> flights
#> <int>
#> 1 336776

本文分享自微信公众号 - 庄闪闪的R语言手册(Zss_R4ds),作者:我才是赵西西

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-12-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • R数据科学|5.5.3内容介绍

    最简单的一种方法是:使用geom_point()画出散点图。你可以将相关变动看作点的模式。例如,你可以看到钻石的克拉数和价值之间存在一种指数关系:

    庄闪闪
  • R数据科学|5.5.1 内容介绍

    如果变动描述的是一个变量内部的行为,那么相关变动描述的就是多个变量之间的行为。相关变动是两个或多个变量以相关的方式共同变化所表现出的趋势。查看相关变动的最好 方...

    庄闪闪
  • R数据科学|5.3内容介绍

    上一期我们对《R数据科学》第3.7节进行了内容介绍和习题解答,细心的读者可以发现,这里直接跳转到了5.3节了。原因在于中间各节内容干货较少,也没有习题,所以就跳...

    庄闪闪
  • R数据科学|第九章内容介绍

    在实际应用中,我们常会涉及到多个数据表,必须综合使用它们才能找到关键信息。存在于多个表中的这种数据统称为关系数据。本章中的很多概念都和SQL中的相似,只是在dp...

    庄闪闪
  • R数据科学|第七章内容介绍

    tibble是一种简单数据框,它对data.frame的功能进行了一些修改,更易于使用。本文将介绍tidyverse的核心R包之一——tibble包

    庄闪闪
  • R数据科学|第十章内容介绍

    可以使用str_sub()函数来提取字符串的一部分。除了字符串参数外,str_sub() 函数中还 有 start 和 end 参数,它们给出了子串的位置(包括...

    庄闪闪
  • R数据科学|第八章内容介绍

    本文将介绍如何使用readr包将平面文件加载到 R 中,readr 也是 tidyverse 的核心 R包之一。

    庄闪闪
  • R数据科学|第十一章内容介绍

    因子在 R 中用于处理分类变量。从历史上看,因子远比字符串更容易处理。因此,R 基础包中的很多函数都自动将字符串转换为因子。

    庄闪闪
  • R数据科学|3.4内容介绍及习题解答

    通过基于变量名的操作,select()函数可以让你生成一个有用的变量子集。基本用法如下:

    庄闪闪
  • R数据科学|3.7内容介绍及习题解答

    虽然与summarize()函数结合起来使用是最有效的,但分组也可以与mutate()和filter()函数结合,以完成非常便捷的操作。示例如下:

    庄闪闪
  • R数据科学|3.5内容介绍及习题解答

    上节我们对选择现有的列进行了介绍与习题解答,现在对数据框添加新列进行介绍,这里使用mutate()函数,注意:mutate()总是将新列添加在数据集的最后。

    庄闪闪
  • R数据科学|5.4内容介绍及习题解答

    我们不建议使用这种方式,因为一个无效测量不代表所有测量都是无效的。此外,如果数据质量不高,若对每个变量都采取这种做法,那么你最后可能会发现数据已经所剩无几!

    庄闪闪
  • R数据科学|5.5.2内容介绍及课后习题解答

    要想对两个分类变量间的相关变动进行可视化表示,需要计算出每个变量组合中的观测数量。常用的两种方法有:

    庄闪闪
  • R数据科学|3.6习题解答

    这个问题是数据分析的一个基本问题:成本函数。作为分析人员,我们之所以对航班延误感兴趣,是因为对乘客来说代价高昂。在许多情况下,到达延迟更重要。在大多数情况下,迟...

    庄闪闪
  • (数据科学学习手札41)folium基础内容介绍

      folium是js上著名的地理信息可视化库leaflet.js为Python提供的接口,通过它,我们可以通过在Python端编写代码操纵数据,来调用leaf...

    Feffery
  • (数据科学学习手札42)folium进阶内容介绍

      在上一篇(数据科学学习手札41)中我们了解了folium的基础内容,实际上folium在地理信息可视化上的真正过人之处在于其绘制图像的高度可定制化上,本文就...

    Feffery
  • (数据科学学习手札43)Plotly基础内容介绍

      Plotly是一个非常著名且强大的开源数据可视化框架,它通过构建基于浏览器显示的web形式的可交互图表来展示信息,可创建多达数十种精美的图表和地图,本文就将...

    Feffery
  • 数据结构内容介绍(一)

    我认为数据结构就是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存...

    花狗Fdog
  • 数据科学的基本内容

    什么是数据科学?它和已有的信息科学、统计学、机器学习等学科有什么不同?作为一门新兴的学科,数据科学依赖两个因素: 一是数据的广泛性和多样性; 二是数据研究的共性...

    小莹莹

扫码关注云+社区

领取腾讯云代金券