R之data.table -melt/dcast(數據拆分和合並)
寫在前面:數據整形的過程確實和揉面團有些類似,先將數據通過melt()
函數將數據揉開,然后再通過dcast()
函數將數據重塑成想要的形狀
reshape2包:
melt-把寬格式數據轉化成長格式。
cast-把長格式數據轉化成寬格式。(dcast-輸出時返回一個數據框。acast-輸出時返回一個向量/矩陣/數組。)
注:melt是數據融合的意思,它做的工作其實就是把數據由“寬”轉“長”。
cast 函數的作用除了還原數據外,還可以對數據進行整合。
dcast 輸出數據框。公式的左邊每個變量都會作為結果中的一列,而右邊的變量被當成因子類型,每個水平都會在結果中產生一列。
tidyr包:
gather-把寬度較大的數據轉換成一個更長的形式,它類比於從reshape2包中融合函數的功能
spread-把長的數據轉換成一個更寬的形式,它類比於從reshape2包中鑄造函數的功能。
data.table包:
data.table的函數melt 和dcast 是增強包reshape2里同名函數的擴展
library(data.table)
ID <- c(NA,1,2,2)
Time <- c(1,2,NA,1)
X1 <- c(5,3,NA,2)
X2 <- c(NA,5,1,4)
mydata <- data.table(ID,Time,X1,X2)
mydata
## ID Time X1 X2
## 1: NA 1 5 NA
## 2: 1 2 3 5
## 3: 2 NA NA 1
## 4: 2 1 2 4
md <- melt(mydata, id=c("ID","Time")) #or md <- melt(mydata, id=1:2)
#melt以使每一行都是一個唯一的標識符-變量組合
md #將第一列作為id列,其他列全部融合就可以了
## ID Time variable value
## 1: NA 1 X1 5
## 2: 1 2 X1 3
## 3: 2 NA X1 NA
## 4: 2 1 X1 2
## 5: NA 1 X2 NA
## 6: 1 2 X2 5
## 7: 2 NA X2 1
## 8: 2 1 X2 4
將變量"variable",和"value"揉合在一起,結果產生了新的兩列,一列是變量variable,指代是哪個揉合變量,另外一列是取值value,即變量對應的值。我們也稱這樣逐行排列的方式稱為長數據格式
melt:數據集的融合是將它重構為這樣一種格式:每個測量變量獨占一行,行中帶有要唯一確定這個測量所需的標識符變量。
str(mydata)
## Classes 'data.table' and 'data.frame': 4 obs. of 4 variables:
## $ ID : num NA 1 2 2
## $ Time: num 1 2 NA 1
## $ X1 : num 5 3 NA 2
## $ X2 : num NA 5 1 4
## - attr(*, ".internal.selfref")=<externalptr>
str(md)
## Classes 'data.table' and 'data.frame': 8 obs. of 4 variables:
## $ ID : num NA 1 2 2 NA 1 2 2
## $ Time : num 1 2 NA 1 1 2 NA 1
## $ variable: Factor w/ 2 levels "X1","X2": 1 1 1 1 2 2 2 2
## $ value : num 5 3 NA 2 NA 5 1 4
## - attr(*, ".internal.selfref")=<externalptr>
setcolorder(md,c("ID","variable","Time","value")) ##setcolorder()可以用來修改列的順序。
md
## ID variable Time value
## 1: NA X1 1 5
## 2: 1 X1 2 3
## 3: 2 X1 NA NA
## 4: 2 X1 1 2
## 5: NA X2 1 NA
## 6: 1 X2 2 5
## 7: 2 X2 NA 1
## 8: 2 X2 1 4
mdr <- melt(mydata, id=c("ID","Time"),variable.name="Xzl",value.name="Vzl",na.rm = TRUE) #variable.name定義變量名
mdr
## ID Time Xzl Vzl
## 1: NA 1 X1 5
## 2: 1 2 X1 3
## 3: 2 1 X1 2
## 4: 1 2 X2 5
## 5: 2 NA X2 1
## 6: 2 1 X2 4
mdr1 <- melt(mydata, id=c("ID","Time"),variable.name="Xzl",value.name="Vzl",measure.vars=c("X1"),na.rm = TRUE) #measure.vars篩選
mdr1
## ID Time Xzl Vzl
## 1: NA 1 X1 5
## 2: 1 2 X1 3
## 3: 2 1 X1 2
md[Time==1]
## ID variable Time value
## 1: NA X1 1 5
## 2: 2 X1 1 2
## 3: NA X2 1 NA
## 4: 2 X2 1 4
md[Time==2]
## ID variable Time value
## 1: 1 X1 2 3
## 2: 1 X2 2 5
#執行整合
# rowvar1 + rowvar2 + ... ~ colvar1 + colvar2 + ...
# 在這個公式中,rowvar1 + rowvar2 + ... 定義了要划掉的變量集合,以確定各行的內容,而colvar1 + colvar2 + ... 則定義了要划掉的、確定各列內容的變量集合。
newmd<- dcast(md, ID~variable, mean)
newmd
## ID X1 X2
## 1: 1 3 5.0
## 2: 2 NA 2.5
## 3: NA 5 NA
newmd2<- dcast(md, ID+variable~Time)
newmd2
## ID variable 1 2 NA
## 1: 1 X1 NA 3 NA
## 2: 1 X2 NA 5 NA
## 3: 2 X1 2 NA NA
## 4: 2 X2 4 NA 1
## 5: NA X1 5 NA NA
## 6: NA X2 NA NA NA
#ID+variable~Time 使用Time對(ID,variable)分組 Time:1,2,NA 類似excel的數據透析
newmd3<- dcast(md, ID~variable+Time)
newmd3 #variable:X1,X2 Time:1,2,NA 類似excel的數據透析
## ID X1_1 X1_2 X1_NA X2_1 X2_2 X2_NA
## 1: 1 NA 3 NA NA 5 NA
## 2: 2 2 NA NA 4 NA 1
## 3: NA 5 NA NA NA NA NA