R中reshape2包下melt()的用法

原文链接:http://bbs.pinggu.org/thread-3112091-1-1.html


melt 是溶解/分解的意思, 即拆分数据。 

reshape/reshape2 的 melt 函数是个 S3 通用函数,它会根据数据类型(数据框,数组或列表)选择 melt.data.frame, melt.array 或 melt.list 函数进行实际操作。 

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 
   
2. 如果是列表数据,melt 函数将列表中的数据拉成两列,一列记录列表元素的值,另一列记录列表元素的名称;如果列表中的元素是列表,则增加列变量存储元素名称。元素值排列在前,名称在后,越是顶级的列表元素名称越靠后:


> datax <- list(agi="AT1G10000", GO=c("GO:1010","GO:2020"), KEGG=c("0100", "0200", "0300")) 
> melt(datax) 
                    value   L1 
        1 AT1G10000  agi 
        2   GO:1010   GO 
        3   GO:2020   GO 
        4      0100 KEGG 
        5      0200 KEGG 
        6      0300 KEGG 

> melt(list(at_0100=datax)) 
              value   L2      L1 
        1 AT1G10000  agi at_0100 
        2   GO:1010   GO at_0100 
        3   GO:2020   GO at_0100 
        4      0100 KEGG at_0100 
        5      0200 KEGG at_0100 
        6      0300 KEGG at_0100 
    
3. 如果数据是数据框类型,melt的参数就稍微复杂些:
  > melt(data, id.vars, measure.vars, 
variable.name = "variable", ..., na.rm = FALSE, 
value.name = "value") 
    
其中 id.vars 是被当做维度的列变量,每个变量在结果中占一列;measure.vars 是被当成观测值的列变量,它们的列变量名称和值分别组成 variable 和 value两列,列变量名称用variable.name 和 value.name来指定。
   
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值