數據重塑通常使用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
示例圖:
參考文檔: