分组:音乐和数据都离不开它
一个常见的分析问题是:如何为数据中的每个分组计算汇总统计量。例如,您可能想按月份或按地区查看销售收入。在 R 中,将数据拆分为若干组、对每组应用汇总统计,再把结果合并为单一数据结构的过程,称为"split-apply-combine"。不过,这个概念早已存在:SQL 数十年来一直有 GROUP BY 语句。"map-reduce"与之相近,其中"map"大致对应"拆分"和"应用","reduce"对应"合并"。dplyr/sparklyr 的做法是先使用 group_by(),再进行 mutate() 或 summarize()。它接收要分组的列名(不加引号)。例如,若要对列 x 计算均值,并按列 grp1 与 grp2 的取值组合分组,代码如下所示。
a_tibble %>%
group_by(grp1, grp2) %>%
summarize(mean_x = mean(x))
请注意,传递给 group_by() 的列通常应为分类变量。例如,如果您想根据身高计算平均体重,直接按身高分组并不合理,因为每个人的身高几乎都不同。不过,您可以使用 cut() 将身高离散化为若干类别,然后对每个类别计算平均体重。
本练习是课程的一部分
R 中使用 sparklyr 的 Spark 入门
练习说明
已经为您创建了名为 spark_conn 的 Spark 连接。已在 Spark 中预先定义了与曲目信息关联的 tibble,名称为 track_metadata_tbl。
- 按
artist_name对track_metadata的内容进行分组,然后:- 将分组后的
duration均值汇总为新列mean_duration。 - 将结果赋值给
duration_by_artist。
- 将分组后的
- 通过按
mean_duration升序排列行,找出歌曲最短的艺人。 - 同样地,通过按
mean_duration降序排列,找出歌曲最长的艺人。
交互式实操练习
通过完成这段示例代码来试试这个练习。
# track_metadata_tbl has been pre-defined
track_metadata_tbl
duration_by_artist <- track_metadata_tbl %>%
# Group by artist
___ %>%
# Calc mean duration
___
duration_by_artist %>%
# Sort by ascending mean duration
___
duration_by_artist %>%
# Sort by descending mean duration
___