使用 dplyr 包進行數據操作與清洗 | EthanDeng(轉載)

本文轉載自:使用 dplyr 包進行數據操作與清洗 | EthanDeng+http://ddswhu.com/2015/02/05/dplyr-data-clean-manipulation/

轉載請註明以上原文地址。


使用 dplyr 包進行數據操作與清洗

  在我們數據分析的實際應用中,我們可能會花費大量的時間在數據清洗上,而如果使用 R 裏面自帶的一些函數(base 包的 transform 等),可能會覺得力不從心,或者不是很人性化。好在我們有其他選擇。這裏我們介紹 dplyr 包。

單表操作函數(one table verbs)

  • filter: 保留滿足條件的行
  • select: 使用列名選出列
  • arrange: 對數據的所有行排序
  • mutate: 添加新的變量
  • summarise: 分類彙總

這些函數的結構如下:

  • 第一個參數爲 data frame 名
  • 接下來的參數是指定函數操作的依據(或條件)
  • 通常返回的是一個 data frame
  • 我們這裏一個一個函數介紹,爲了更好地表述我們的操作,我們這裏使用一個構造的 data frame。
df <- data.frame(
      color = c("blue", "black", "blue", "blue", "black"),
      value = 1:5)

filter

  filter 用於選擇滿足條件的觀測(行),第一個參數是 data frame 名字,第二個參數是條件。這裏舉兩個例子,我們對上面構造的 data frame 進行 filter 操作。第一個例子要求選取 color == blue 的觀測; 第二個例子要求選取 value == 1 或者 value == 4 的觀測。
  我們的 data frame 如下:

> df
  color value
1  blue     1
2 black     2
3  blue     3
4  blue     4
5 black     5

  例子:

# 選取 `color == blue` 的觀測
> filter(df, color == "blue")
  color value
1  blue     1
2  blue     3
3  blue     4
 # 選取 `value == 1` 或者 `value == 4 ` 的觀測。
> filter(df, value %in% c(1, 4))
  color value
1  blue     1
2  blue     4

效果如下:
這裏寫圖片描述

  注意: 這裏需要提醒的是,對於多條件的選擇,需要完整條件的,然後使用集合運算符將條件拼接起來。集合運算符有 !、|、&、xor(交補)。條件的判斷符有>(=)、<(=)、==、!=、%in% (判斷元素是否在集合或者列表內,返回邏輯值)。

filter(flights, dest %in% c("SFO", "OAK"))
filter(flights, dest == "SFO" | dest == "OAK")
 # 下面是錯誤寫法
filter(flights, dest == "SFO" | "OAK")

select

  select 用於選擇列,比如

> select(df, color)
  color
1  blue
2 black
3  blue
4  blue
5 black
> select(df, -color)
  value
1     1
2     2
3     3
4     4
5     5

  注意: select 中負號表示不選擇。其中變量的聲明還有其他形式,比如B:F表示從 B 列到 F 列所有列;ends_with(“string”) 表示選取列名以 string 結尾的全部列;contains(“string”) 表示選取列名中含有 string 的所有列。代碼如下:

select(flights, arr_delay, dep_delay)
select(flights, arr_delay:dep_delay)
select(flights, ends_with("delay"))
select(flights, contains("delay"))

arrange

  arrange 用於根據變量排序,如果排序依據(列)是字符,按照字母表的順序,如果是數字,默認按照從小到大的順序排序,如果需要使用逆序排,可以使用desc(var) 或者 -var。

> arrange(df, color)
  color value
1 black     2
2 black     5
3  blue     1
4  blue     3
5  blue     4
> arrange(df, desc(value))
  color value
1 black     5
2  blue     4
3  blue     3
4 black     2
5  blue     1

  注意: 多個排序依據直接把列名放在函數內,用逗號隔開;可以在排序裏面使用計算,比如

arrange(flights, date, hour, minute)
arrange(flights, desc(dep_delay - arr_delay))

mutate

  mutate 用於添加新的變量,直接使用列名進行計算得到新變量即可。而且它很有特色地方是,可以使用剛添加的變量,也就是在一個語句中可以多個變量,而且變量可以來源於剛新建的變量。

> mutate(df, double = 2 * value, quadruple = 2 * double)
  color value double quadruple
1  blue     1      2         4
2 black     2      4         8
3  blue     3      6        12
4  blue     4      8        16
5 black     5     10        20

summarise

  summarise 可以用於“分類彙總”,但不是傳統意義上的分類彙總,它還能做更多。

> by_color <- group_by(df, color) # 分組依據
> summarise(by_color, total = sum(value)) # 分組求和
Source: local data frame [2 x 2]
  color total
1 black     7
2  blue     8

  實際上它是把我們現有的完整 data frame 依據分組依據(這裏是 color)拆分成多個 data frame,然後對每個 data frame 分別計算,類似於 ddply。
  使用經歷:分組依據可以多個,比如根據城市、月份、年份,我們對數據進行分類彙總,可以得到每個城市每一年每月的情況。

  summarise 可以使用的函數有:

  • min(x), median(x), max(x), quantile(x, p)
  • n(), n_distinct(), sum(x), mean(x)
  • sum(x > 10), mean(x > 10)
  • sd(x), var(x), iqr(x), mad(x)

參考資料:

  Hadley Wickham:Data manipulation with dplyr.

結語:

  本文只是一個引子,dplyr 包還有很多內容(data pipelines, two table verbs)值得大家學習,用於更加高效的清洗數據,事實上,我現在每次處理數據的時候都需要用到這個包,確實非常好的一個包,用法簡單,功能強大,推薦大家去學習使用!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章