【问题标题】:Reshape data in R在 R 中重塑数据
【发布时间】:2014-02-17 22:08:41
【问题描述】:

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

首先,我想建立一个系统发育树,所以想有一个这样的矩阵。由于我没有 value 列,我该如何使用 reshape 库?

下面的代码不起作用:

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

【问题讨论】:

  • 你想要dcast(或acast)来自reshape2reshape 是一个旧包

标签: r reshape


【解决方案1】:

如果不是强制使用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

【讨论】:

    【解决方案2】:

    您可以使用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

    EDIT ##:对于对称矩阵。

    要在使用table 时生成对称矩阵,您需要两个参数具有相同的级别,这里的值不是因子而是字符串,那么没有级别但它是相同的。您需要在gene2 中每个唯一的gene1 至少出现一次,反之亦然。

    为此,我建议您创建一个包含所有基因的载体(我使用了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
    

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

    【讨论】:

    • 我怎样才能有一个矩阵,我可以将所有基因作为行,所有基因也作为列。然后有一个对称矩阵。我想计算这个矩阵的距离跨度>
    猜你喜欢
    • 2017-02-11
    • 1970-01-01
    • 2013-04-20
    • 2010-12-04
    相关资源
    最近更新 更多