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包中,我們用得比較多的是melt和cast兩個函數。
- melt函數:對寬數據進行處理,得到長數據;
- cast函數:對長數據進行處理,得到寬數據。
1. melt()函數
調用公式:
> melt(data, id.vars, measure.vars, variable.name = "variable", ...,
na.rm = FALSE, value.name = "value", factorsAsStrings = TRUE)
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
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'
數據轉換目的:在一行上展示所有Month和Day組合下的Ozone、Solar.R、Wind和Temp值
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
附學習文檔:
- An Introduction to reshape2
- Data Manipulation with reshape2
- 探索R包reshape2:揉數據的最佳伴侶
- How to reshape data in R: tidyr vs reshape2
- Reshape and aggregate data with the R package reshape2
關於R語言請關注專欄:R語言與數據挖掘 - 知乎專欄
欲加入R語言交流羣,請搜索公衆號“如臨春風”,回覆“R語言”或“r語言”即可獲取二維碼信息。