R之data.table -melt/dcast(數據合並和拆分)


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


免責聲明!

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



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