重塑R中的数据

时间:2014-02-17 22:08:41

标签: r reshape

我想从这个数据框中得到一个矩阵。如果一对基因之间存在关系,那么这些值应该是基础,如果不是则为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)

2 个答案:

答案 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

希望这有帮助,但这可能不是最好的方法。