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来指定。
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来指定。