【數據處理】reshape2包

https://zhuanlan.zhihu.com/p/22249895?refer=rdatamining


前言

reshape2是又一個用來做數據處理的拓展包,用於實現寬格式數據與長格式數據之間的互轉。如果你熟悉結構化數據庫查詢,那麼你一定知道列轉行與行轉列,寬長數據之間互轉與之類似;如果你不熟悉的也沒關係,它很簡單,接着往下看你就能很快熟悉並掌握了。首先我們通過一個數據集來解釋什麼是長寬數據。


一、寬數據與長數據

1. 寬數據

定義:每一列爲一個觀測變量,每一行爲變量對應的觀測值。

#   ozone   wind  temp
# 1 23.62 11.623 65.55
# 2 29.44 10.267 79.10
# 3 59.12  8.942 83.90
# 4 59.96  8.794 83.97

2. 長數據

定義:一列就包含了所有的變量,而另一行則是與之相關的值(長數據不一定只有兩列)。

#    variable  value
# 1     ozone 23.615
# 2     ozone 29.444
# 3      wind 11.623
# 4      wind 10.267
# 5      temp 65.548
# 6      temp 79.100

二、reshape2包

在reshape2包中,我們用得比較多的是meltcast兩個函數。

  • melt函數:對寬數據進行處理,得到長數據;
  • cast函數:對長數據進行處理,得到寬數據。

1. melt()函數

調用公式:

> melt(data, id.vars, measure.vars,  variable.name = "variable", ..., 
  na.rm = FALSE, value.name = "value", factorsAsStrings = TRUE)
(1)默認情況下,melt認爲所有數值列的變量均有值,此處使用R內置數據集'iris'
 data1 <- melt(iris)
 head(iris)
Species     variable value
1  setosa Sepal.Length   5.1
2  setosa Sepal.Length   4.9
3  setosa Sepal.Length   4.7
4  setosa Sepal.Length   4.6
5  setosa Sepal.Length   5.0
6  setosa Sepal.Length   5.4

(2)加入識別指標[id.vars = ],R會根據id.vars進行數據整理,即除去指標中指定的變量,其他數據都被進行了變形。此處使用R內置數據集'airquality'

數據轉換目的:得到每個月(Month)以及每天(Day)Ozone, Solar.R, Wind以及Temp的值。

 data2 <- melt(airquality,id.vars = c("Month","Day"))
 head(data2)
  Month Day variable value
1     5   1    Ozone    41
2     5   2    Ozone    36
3     5   3    Ozone    12
4     5   4    Ozone    18
5     5   5    Ozone    NA
6     5   6    Ozone    28
(3)觀測值的變量[mearsure.vars = ],變量名和數值各佔一列
 data6 <- melt(iris,measure.vars = "Species")
 head(data6,3)
  Sepal.Length Sepal.Width Petal.Length Petal.Width variable  value
1          5.1         3.5          1.4         0.2  Species setosa
2          4.9         3.0          1.4         0.2  Species setosa
3          4.7         3.2          1.3         0.2  Species setosa
# 指定了'Species'列爲觀測對象,則變量名佔一列,具體值佔一列

2. cast()函數

cast()函數的運用並沒有melt()直觀,在reshape2中有好幾個cast版本的函數:
  • 對於data.frame格式的數據,需要使用dcast()函數。
  • 對於向量、矩陣或者數組格式的數據,需要使用acast()函數。

由於在平常的數據處理上,我們更多的使用格式爲'dataframe'的數據,因此我們重點講解dcast()函數的使用。

(1)dcast()調用公式:
dcast(data, formula, fun.aggregate = NULL)

dcast藉助於公式來描述數據的形狀,左邊參數表示"ID variables",而右邊的參數表示measured variables。可能需要幾次嘗試,才能找到合適的公式。此處使用上文已經過melt轉換後的數據集'data2'

數據轉換目的:在一行上展示所有MonthDay組合下的Ozone、Solar.R、WindTemp

 data3 <- dcast(data2,Month + Day ~ variable)
 head(data3)

(2)上文中,我們指定Month和Day爲'ID Variables',得到重鑄後的數據集,但如果只指定Month一個變量,而由於Day變量的存在,新的數據集無法展現所有的數據(Day不唯一)R會報錯,爲此,我們需要聚合(aggregate)這些數據,包括mean()、median()、sum()等

 data4 <- dcast(data2,Month ~ variable,fun.aggregate = mean,na.rm=TRUE)
# 分別得到各月各個特徵的均值
> data4
  Month    Ozone  Solar.R      Wind     Temp
1     5 23.61538 181.2963 11.622581 65.54839
2     6 29.44444 190.1667 10.266667 79.10000
3     7 59.11538 216.4839  8.941935 83.90323
4     8 59.96154 171.8571  8.793548 83.96774
5     9 31.44828 167.4333 10.180000 76.90000

(3)fun函數也可以自行編寫(自編函數

# 查看缺失值
  find_null <- function(x){
   return(sum(is.na(x)))}
 data5 <- dcast(data2,Month~variable,find_null)
> data5
  Month Ozone Solar.R Wind Temp
1     5     5       4    0    0
2     6    21       0    0    0
3     7     5       0    0    0
4     8     5       3    0    0
5     9     1       0    0    0

附學習文檔:

  1. An Introduction to reshape2
  2. Data Manipulation with reshape2
  3. 探索R包reshape2:揉數據的最佳伴侶
  4. How to reshape data in R: tidyr vs reshape2
  5. Reshape and aggregate data with the R package reshape2

關於R語言請關注專欄:R語言與數據挖掘 - 知乎專欄

欲加入R語言交流羣,請搜索公衆號“如臨春風”,回覆“R語言”或“r語言”即可獲取二維碼信息。


發佈了7 篇原創文章 · 獲贊 23 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章