團體在音樂很棒,在資料上一樣好用
在分析中,經常需要為每個群組計算彙總統計值。比方說,你可能想知道依月份或依地區的銷售收入。在 R 中,將資料分成群組、對每個群組套用彙總統計,然後把結果合併回單一資料結構的流程,稱為「split-apply-combine」。這個概念其實更早就存在了:SQL 已經有 GROUP BY 敘述幾十年之久。「map-reduce」也是類似概念,其中「map」大致對應「split」與「apply」步驟,而「reduce」則是「combine」。在 dplyr/sparklyr 中,做法是先使用 group_by(),再進行 mutate() 或 summarize()。它接收未加引號的欄位名稱作為分組鍵。舉例來說,若要針對欄位 grp1 與 grp2 的每種組合,計算欄位 x 的平均值,可以這樣寫:
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
___