我想从这个数据框中得到一个矩阵。如果一对基因之间存在关系,那么这些值应该是基础,如果不是则为0.因此ADRA1D和ADK的值为1,其他对也是如此。但是没有一对ADK和AR,因此在该矩阵中它应该是0。
tab <- read.table(text="ID gene1 gene2
1 ADRA1D ADK
2 ADRA1B ADK
3 ADRA1A ADK
4 ADRB1 ASIC1
5 ADRB1 ADK
6 ADRB2 ASIC1
7 ADRB2 ADK
8 AGTR1 ACHE
9 AGTR1 ADK
10 ALOX5 ADRB1
11 ALOX5 ADRB2
12 ALPPL2 ADRB1
13 ALPPL2 ADRB2
14 AMY2A AGTR1
15 AR ADORA1
16 AR ADRA1D
17 AR ADRA1B
18 AR ADRA1A
19 AR ADRA2A
20 AR ADRA2B", header=TRUE, stringsAsFactors=FALSE)
首先,我想建立一个系统发育树,所以想到有这样的矩阵。我怎么能使用reshape库,因为我没有值列?
以下代码不起作用:
library(reshape)
ct=cast(tab,gene1~gene2)
答案 0 :(得分:2)
如果不是强制使用reshape
,我建议您查看igraph.
这是使用igraph
包获得对称矩阵的一种方法。我们首先将您的数据框(相关的2列)转换为igraph
对象,然后 get_adjacency
执行此操作。
library(igraph)
g <- graph.data.frame(tab[,c(2,3)])
get.adjacency(g)
这为您提供了邻接矩阵。你应该考虑使用igraph进行其余的分析。
16 x 16 sparse Matrix of class "dgCMatrix"
[[ suppressing 16 column names ‘ADRA1D’, ‘ADRA1B’, ‘ADRA1A’ ... ]]
ADRA1D . . . . . . . . . . 1 . . . . .
ADRA1B . . . . . . . . . . 1 . . . . .
ADRA1A . . . . . . . . . . 1 . . . . .
ADRB1 . . . . . . . . . . 1 1 . . . .
ADRB2 . . . . . . . . . . 1 1 . . . .
AGTR1 . . . . . . . . . . 1 . 1 . . .
ALOX5 . . . 1 1 . . . . . . . . . . .
ALPPL2 . . . 1 1 . . . . . . . . . . .
AMY2A . . . . . 1 . . . . . . . . . .
AR 1 1 1 . . . . . . . . . . 1 1 1
ADK . . . . . . . . . . . . . . . .
ASIC1 . . . . . . . . . . . . . . . .
ACHE . . . . . . . . . . . . . . . .
ADORA1 . . . . . . . . . . . . . . . .
ADRA2A . . . . . . . . . . . . . . . .
ADRA2B . . . . . . . . . . . . . . . .
使用igraph
的一个优点是现在可以使用许多基于图形的距离计算方法。请查看shortest.paths
答案 1 :(得分:1)
您可以使用table
功能实现此目的:
> table(tab$gene1, tab$gene2)
ACHE ADK ADORA1 ADRA1A ADRA1B ADRA1D ADRA2A ADRA2B ADRB1 ADRB2 AGTR1 ASIC1
ADRA1A 0 1 0 0 0 0 0 0 0 0 0 0
ADRA1B 0 1 0 0 0 0 0 0 0 0 0 0
ADRA1D 0 1 0 0 0 0 0 0 0 0 0 0
ADRB1 0 1 0 0 0 0 0 0 0 0 0 1
ADRB2 0 1 0 0 0 0 0 0 0 0 0 1
AGTR1 1 1 0 0 0 0 0 0 0 0 0 0
ALOX5 0 0 0 0 0 0 0 0 1 1 0 0
ALPPL2 0 0 0 0 0 0 0 0 1 1 0 0
AMY2A 0 0 0 0 0 0 0 0 0 0 1 0
AR 0 0 1 1 1 1 1 1 0 0 0 0
如果需要矩阵结构,请使用as.matrix
。
编辑##:对于对称矩阵。
要在使用table
时生成对称矩阵,您需要两个参数具有相同的级别,这里的值不是因子而是字符串,那么没有级别但是它们是相同的。你需要在gene2中至少出现一个独特基因1,反之亦然。
为此,我建议你创建一个包含所有基因的载体(我使用sort(unique(c(unique(tab$gene1), unique(tab$gene2))))
)。
我将“gene1”与此向量合并,保持所有出现没有对应关系,它将产生NA而不是与某事物连接。 “gene2”也是一样。
现在,你可以在“gene1”和“gene2”中拥有每个基因中至少一个基因,你可以table
。
genes <- c('ACHE','ADK','ADORA1','ADRA1A','ADRA1B','ADRA1D','ADRA2A','ADRA2B','ADRB1','ADRB2','AGTR1','ALOX5','ALPPL2','AMY2A','AR','ASIC1')
df <- merge(tab, as.data.frame(genes), by.x = "gene1", by.y = "genes", all = TRUE)
df <- merge(df, as.data.frame(genes), by.x = "gene2", by.y = "genes", all = TRUE)
> table(df$gene1, df$gene2)
ACHE ADK ADORA1 ADRA1A ADRA1B ADRA1D ADRA2A ADRA2B ADRB1 ADRB2 AGTR1 ALOX5 ALPPL2 AMY2A AR ASIC1
ACHE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ADK 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ADORA1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ADRA1A 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ADRA1B 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ADRA1D 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ADRA2A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ADRA2B 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ADRB1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
ADRB2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1
AGTR1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ALOX5 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0
ALPPL2 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0
AMY2A 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
AR 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0
ASIC1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
希望这有帮助,但这可能不是最好的方法。