1. 程式人生 > >R:reshape2包中的melt

R:reshape2包中的melt

記錄 nbsp false 選擇 語法 維度 觀測 ble let

melt()函數
melt為熔化、溶解的意思,此處可理解為扔進去一個東西,出來另外一個本質一樣但形狀不一樣的東西。
語法結構:melt(data, ..., na.rm = FALSE, value.name = "value")

其中:data可以是數據框、數組或列表,melt()函數會根據數據類型選擇 melt.data.frame, melt.array 或 melt.list 函數進行實際操作。

(1)數據類型為data.frame時:扔進去的是data.frame,出來的仍是data.frame,但形狀不一樣了

> (d<-data.frame(
area=c(1,1,2,3,3,1),
PH=c(2.3,2.9,4.0,7.9,8.0,3.2),
temp=c(23,21,19,10,13,19),
p=c(0.99,0.95,0.85,0.34,0.25,0.90))
)
area PH temp p
1 1 2.3 23 0.99
2 1 2.9 21 0.95
3 2 4.0 19 0.85
4 3 7.9 10 0.34
5 3 8.0 13 0.25
6 1 3.2 19 0.90
> melt(d,id.var="area") #以area為列變量對數據框d進行重新排列
area variable value
1 1 PH 2.30
2 1 PH 2.90
3 2 PH 4.00
4 3 PH 7.90
5 3 PH 8.00
6 1 PH 3.20
7 1 temp 23.00
8 1 temp 21.00
9 2 temp 19.00
10 3 temp 10.00
11 3 temp 13.00
12 1 temp 19.00
13 1 p 0.99
14 1 p 0.95
15 2 p 0.85
16 3 p 0.34
17 3 p 0.25
18 1 p 0.90

#當area為id.vars時,其他變量(measure.vars)均在variable列,value對應該variable的值

> melt(d,measure.vars="area") #此時area為度量變量,value列將顯示其變量值
PH temp p variable value
1 2.3 23 0.99 area 1
2 2.9 21 0.95 area 1
3 4.0 19 0.85 area 2
4 7.9 10 0.34 area 3
5 8.0 13 0.25 area 3
6 3.2 19 0.90 area 1

#當area為measure.vars時,其他變量均是id.vars,故id.vars和measure.vars兩參數根據便利性任選其一即可

(2)數據類型為list時:扔進去是list,出來的是data.frame

>( l<-list(a=c("John","Lucy","Peter","Shane"),b=c(80,76,90,88),c=c("M","F","M","M")))
$a
[1] "John" "Lucy" "Peter" "Shane"

$b
[1] 80 76 90 88

$c
[1] "M" "F" "M" "M" #列表l包含三個成分,成分名分別為a、b、c

> melt(l,id.vars="a")
value L1
1 John a
2 Lucy a
3 Peter a
4 Shane a
5 80 b
6 76 b
7 90 b
8 88 b
9 M c
10 F c
11 M c
12 M c
#出來的data.frame包含兩列,列表的成分名為一列,列名為L1;各成分值為一列,列名為value。如果list中有list類型的成分,則melt轉化為三列,L1為list名,L2為list下的成分名,value為各成分值

(3)數據類型為array:復制下“DM小菜鳥”的解釋

melt 的用法就很簡單,它依次對各維度的名稱進行組合將 數據進行線性/向量化。如果數組有 n 維,那麽得到的結果共有 n+1 列,前 n 列記錄數組的 位置信息,最後一列才是觀測值。

1. 如果是數組(array)類型,melt 的用法就很簡單,它依次對各維度的名稱進行組合將 數據進行線性/向量化。如果數組有 n 維,那麽得到的結果共有 n+1 列,前 n 列記錄數組的 位置信息,最後一列才是觀測值。


> datax <- array(1:8, dim=c(2,2,2))
> melt(datax)
Var1 Var2 Var3 value
1 1 1 1 1
2 2 1 1 2
3 1 2 1 3
4 2 2 1 4
5 1 1 2 5
6 2 1 2 6
7 1 2 2 7
8 2 2 2 8


> melt(datax, varnames=LETTERS[24:26],value.name="Val")
X Y Z Val
1 1 1 1 1
2 2 1 1 2
3 1 2 1 3
4 2 2 1 4
5 1 1 2 5
6 2 1 2 6
7 1 2 2 7
8 2 2 2 8

R:reshape2包中的melt