2014-02-17 106 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