在使用R语言的过程中,我们会遇到很多问题,比如说长宽矩阵的转化,不能每一次都是手动处理,这样也很麻烦,实现长宽矩阵的转化的方式很多,我们只需要掌握其中一对就好。
1、宽变长
这里我随意设置一个矩阵,作为测试数据
#测试数据的生成,10X10
data=matrix(1:100,nrow=10)
colnames(data)=paste0('sample',1:10)
data=data.frame(gene_name=paste0('gene',1:10),
data)
根据gene_name这一列进行转化,变成一个只有三列的数据
measure_name=setdiff(colnames(data),
c('gene_name'))
library(data.table)
#id.vars:合并的过程中通过那一列进行合并
#measure.vars:将那些列合并在一起
#variable.name:将那些列合并在一起后,新列的名称
#value.name:矩阵内部的数值,赋予一个新的名称
data1=melt(data,
id.vars='gene_name',
measure.vars=measure_name,
variable.name = "sample",
value.name = "expr")
head(data1)
也可以同时根据多列进行合并
#测试数据
data2=data.frame(gene_name1=data$gene_name,data)
data2
measure_name=setdiff(colnames(data2),
c('gene_name','gene_name1'))
library(data.table)
#id.vars:合并的过程中通过那一列进行合并
#measure.vars:将那些列合并在一起
#variable.name:将那些列合并在一起后,新列的名称
#value.name:矩阵内部的数值,赋予一个新的名称
data3=melt(data2,
id.vars=c('gene_name','gene_name1'),
measure.vars=measure_name,
variable.name = "sample",
value.name = "expr")
head(data3)
2、长变宽
我们分别以前面data1和data3为例
head(data1)
library(tidyr)
dat1=spread(data1,key=gene_name,value=expr)
dat1
如果是data3呢?如果直接仿照上面的这种,会直接出现问题,如下:
dat2=spread(data3,key=gene_name1,value=expr)
dat2
怎么解决呢?
dat2=spread(data3,key=sample,value=expr)
dat2
看到这里是不是很懵,其实在使用spread函数进行转化的过程中,有两个参数很重要。
value:就是需要填充到矩阵中的数值
key:选择的这一列以后会作为矩阵的列名,而至于其他的列名,会根据这两个进行填充,这也是为什么会出现前面全是NA的情况