1

次の形式のマトリックスがあります

      gene ids  A-B   A-C  A-D  B-C  B-D C-D

      GENE1     0     0    1    1    1   0
      GENE2     1     0    1    1    1   1
      GENE3     1     0    0    0    1   1
      GENE4     0     1    0    0    0   0

次のように分割したいと思います。上記の行列はペアごとの比較であるため、対角値は空になります。

       Gene1
           A  B   C  D sum   
       A   -  0   0  1  1
       B   0  -   1  1  2
       C   0  1   -  0  1
       D   1  1   0  -  2

      Gene2
           A  B   C  D  sum
       A   -  1   0  1   2
       B   1  -   1  1   3
       C   0  1   -  1   2
       D   1  1   1  -   3

      Gene3
           A  B   C  D  sum
       A   -  1   0  0   1
       B   1  -   0  1   2
       C   0  0   -  1   1
       D   0  1   1  -   2

       Gene4
           A  B   C  D  sum
       A   -  0   1  0   1 
       B   0  -   0  0   0
       C   1  0   -  0   1
       D   0  0   0  -   0

これはデータのサブセットにすぎず、同様の方法で分割する遺伝子が 1000 個以上あります。下の三角形の転置で上の三角形を埋めようとしましたが、多くの遺伝子に対して同じことを行うと成功しませんでした。マトリックス全体を異なるサブマトリックスに分割した後、行ごとに合計し、各遺伝子について同じプロットを取得したいと思います..

以下に示す解決策は、それ以上の数値比較では機能しません。

例:

                  DF <- read.table(text="gene_ids  A-B A-C A-D A-E B-C  B-D B-E C-D C-E D-E
                  GENE1     0     0    1    1    1   0  1  0  1 1
                  GENE2     1     0    1    1    1   1  0  1  1 0
                  GENE3     1     0    0    0    1   1  0  1  0 1  
                   GENE4     0     1    0    0    0   0  1  1  1 0 
                  GENE5     1     1    0    0    0   0  0  1  1 1
                  GENE6    0     1    1   0    0   1  0  0  0 0",   header=TRUE)

提供されたソリューションを使用すると、

                     :[[1]]
                     A  B  C  D  E sum
                   A NA  0  0  1  1   2
                   B  0 NA  1  1  0   2
                   C  0  1 NA  0  1   2
                   D  1  0  0 NA  1   2
                   E  1  1  1  1 NA   4

RowB 、列 D では、値が本来あるべき値ではなく (ゼロでなければなりません)、マトリックスが対称的ではなくなりました...そのため、ほとんどの遺伝子で最終的にエラーが発生します!

4

1 に答える 1

3
DF <- read.table(text="gene_ids  A-B A-C A-D A-E B-C  B-D B-E C-D C-E D-E
                  GENE1     0     0    1    1    1   0  1  0  1 1
                  GENE2     1     0    1    1    1   1  0  1  1 0
                 GENE3     1     0    0    0    1   1  0  1  0 1  
                 GENE4     0     1    0    0    0   0  1  1  1 0 
                 GENE5     1     1    0    0    0   0  0  1  1 1
                 GENE6    0     1    1   0    0   1  0  0  0 0",   header=TRUE)

m_temp <- matrix(NA,ncol=5,nrow=5)
up <- upper.tri(m_temp)
lo <- lower.tri(m_temp)

lapply(seq_len(nrow(DF)), function(i, res) {
  tmpnames <- do.call(rbind,strsplit(names(unlist(DF[i, -1])),"\\."))
  #possibly you need to adjust the seperator here

  rownames(res) <- c(tmpnames[1,1],tmpnames[tmpnames[,1]==tmpnames[1,1],2])
  res[lo] <- unlist(DF[i, -1])
  res[up] <- t(res)[up]
  res <- cbind(res, rowSums(res, na.rm = TRUE))
  colnames(res) <- c(rownames(res),"sum")
  res
}, res = m_temp)

# [[1]]
#    A  B  C  D  E sum
# A NA  0  0  1  1   2
# B  0 NA  1  0  1   2
# C  0  1 NA  0  1   2
# D  1  0  0 NA  1   2
# E  1  1  1  1 NA   4
于 2013-06-24T08:46:32.407 に答える