R:reshape2包中的melt
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
 
                    
                     
                    
                 
                    
                

 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号