2014-02-17 109 views
0

我想从这个数据框中获得一个矩阵。如果一对基因之间存在一个关系,那么这个值应该是基于1的关系,如果不是0,则ADRA1D和ADK的值为1,其他对的值也是。但没有对ADK和AR的所以在这个矩阵应该是0重塑R中的数据

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) 

首先,我想建立一个系统发育树,所以想有这样的一个矩阵。我如何使用重塑库,因为我没有价值列?

下面的代码不起作用:

library(reshape) 
ct=cast(tab,gene1~gene2) 
+0

你想从'reshape2'改用'dcast'(或'acast')来代替。 'reshape'是一个旧的包 – rawr

回答

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

您可以用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时生成对称矩阵,您需要两个参数具有相同的水平,这里的值不是因素,而是字符串,然后没有水平,但它是相同的东西。您至少需要在基因2中发现每个独特基因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 

希望得到这个帮助,这可能不是最好的办法。

+0

我怎样才能有一个矩阵,我可以将所有的基因都作为行,并且列中的所有基因也是这样。然后有一个对称矩阵。我想计算出这个矩阵的距离 – Rgeek