R實戰 第八篇:重塑數據(reshape2)


數據重塑通常使用reshape2包,reshape2包用於實現對寬數據及長數據之間的相互轉換,由於reshape2包不在R的默認安裝包列表中,在第一次使用之前,需要安裝和引用:

install.packages("reshape2")
library(reshape2)

重塑數據,首先把寬數據融合(melt),以使每一行都只表示一個變量,然后把數據重塑(cast)為想要的任何形狀。在重塑過程中,可以使用任何函數對數據進行整合,也可以把長格式轉換為寬格式,這種操作類似於Excel的透視和逆透視。

一,認識寬數據

在同一行,標識變量(一列或多列)能夠唯一標識兩個或多個變量的值,這種數據顯示叫做數據的寬格式,也叫做寬數據

 創建示例數據,ID和Time的組合是唯一的,X1和X2是該行的觀測變量值,

> ID <- c(1,1,2,2)
> Time <- c(1,2,1,2) > X1 <- c(5,3,6,2) > X2 <-c(6,5,1,4) > mydata <- data.frame(ID,Time,X1,X2)

如下所示寬格式的數據,ID和Time的組合是唯一的,同一行有兩個變量X1和X2,通過ID和Time能夠唯一確定變量X1和X2的值:

  ID Time X1 X2
1  1    1  5  6
2  1    2  3  5
3  2    1  6  1
4  2    2  2  4

二,融合數據

數據的融合是指把數據集重塑為特定的格式,使得每個觀測變量獨占一行,每行都有唯一確定每個觀測變量所需要的標識變量。融合之后的數據,稱作長格式,也叫作長數據。

原始數據中,主鍵列唯一確定variable1和variable2的值,在融合之后,如下圖所示,主鍵列和variable列(變量名)唯一確定value列的值。

在R語言中,使用melt()函數來融合數據:

melt(data,id.vars,measure.vars,variable.name='variable',...,na.rm=FALSE,value.name='value',factorAsStrings=TRUE)

參數注釋:

  • data:融合的數據框
  • id.vars:由標識變量構成的向量,用於標識觀測的變量
  • measure.vars :由觀測變量構成的向量
  • variable.name:用於保存原始變量名的變量的名稱
  • value.name:用於保存原始值的名稱

示例,標識變量是ID和Time,X1和X2作為觀測變量:

md <- melt(mydata,id=c("ID","Time"),measure=c("X1","X2"))

數據融合之后,變成長數據,長數據的特征是 ID列(多列或單列)+ 變量名 唯一確定變量的值,並且每一行只能確定一個變量的值。

  ID Time variable value
1  1    1       X1     5
2  1    2       X1     3
3  2    1       X1     6
4  2    2       X1     2
5  1    1       X2     6
6  1    2       X2     5
7  2    1       X2     1
8  2    2       X2     4

注意:必須指定唯一確定每個觀測所需的變量(ID和Time),而表示觀測變量名的變量(X1和X2)由程序自動創建,從結果中可以看出,函數自動創建了兩個變量:variable和value,這兩個變量名稱是默認的,這可以在melt()函數中,通過參數 variable.name="new_variable_name"和 value.name="new_value_name"來自定義。

md <- melt(mydata,id=c("ID","Time"),measure=c("X1","X2"),variable.name = "MeasuredVariable",value.name = "IntValue")

三,重塑數據

dcast()函數用於讀取已融合的數據框(d是指data frame),並使用formula和用於整合數據的函數把數據集重塑成任意形狀:

dcast(data, formula, fun.aggregate = NULL, ..., margins = NULL,
  subset = NULL, fill = NULL, drop = TRUE, value.var = guess_value(data))

參數注釋:

  • data:已融合的數據框
  • formula:用於指定輸出的結果集格式
  • fun.aggregate:用於指定聚合函數,對已聚合的數據執行聚合運算
  • margins:相當於透視表中的行總計和列總計
  • subset:選取滿足一些特定值的數據,相當於Excel透視表的篩選。例如, subset =.(variable ==“length”)
  • fill:用於填充結構缺失的值,默認為將fun.aggregate應用於0長度向量的值
  • value:value列的名稱

參數formula的格式是:

rowvar1 + rowvar2 +...  ~  colvar1 + colvar2 +...

在該公式中,rowvar 定義了保留的變量名,以唯一確定各行的內容;colvar定義了需要重塑的變量名,以確定各列的值。重塑的含義是:按照rowvar,展開colvar,對value進行聚合運算(當fun.aggregate為聚合函數時)。

1,展開colvar

展開colvar的過程,實際上是把列值轉換為列名稱的過程,這種展開操作是由formula參數決定的。

重塑操作中的特例是數據融合的逆操作,把數據的長格式轉化為數據的寬格式,即,把已融合的數據轉換為原始數據格式,對於這種操作,formula參數的格式是固定的:標識變量~variable。

> dcast(md,ID+Time~variable)
  ID Time X1 X2
1  1    1  5  6
2  1    2  3  5
3  2    1  6  1
4  2    2  2  4

2,對觀測變量進行聚合運算

按照ID,計算觀測變量的平均值:

> dcast(md,ID~variable,mean)
  ID X1  X2
1  1  4 5.5
2  2  4 2.5

這種操作,類似於分組聚合:按照ID進行分組,分別計算變量X1和X2的聚合值。

3,添加總計列

計算按照ID分組的X1和X2的均值,並對重塑的結果按照ID計算各列均值,按照X1和X2計算各行的均值。

> dcast(md,ID~variable,mean,margins = c("ID","variable"))
     ID X1  X2 (all)
1     1  4 5.5  4.75
2     2  4 2.5  3.25
3 (all)  4 4.0  4.00

計算的過程是:

按照ID計算各列的均值: X1的值是(5.5+2.5)/2=4

按照變量計算各行的均值:第一行的均值是 (4+5.5)/2=4.75

示例圖:

 

 

 

參考文檔:

利用reshape2包進行數據逆透視和數據透視


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM