R语言矩阵的转化

在使用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的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值