R代码用于处理基因型数据

时间:2015-07-21 03:11:29

标签: r bioinformatics genetics

我有这个名为mydf的数据。

我需要将REF列和ALT列中的字母(DNA字母)与colnames(x)"A","T","G","C")匹配,并将相应的数值粘贴在一起{ {1}}。

但是,有些行我"REF,ALT"列中有"snp:+[0-9]""flat$"

现在我想要TYPE行:

  1. 求和来自"flat$"ALT的{​​{1}}值,包括扁线本身,如果 "snp:+[0-9]"个字母是唯一的(请参阅附在卷曲中的脚本 一条扁平线的支架)
  2. 粘贴 "start"值再次为ALTALT值为 对于具有相同起始ID的"REF,ALT"REF,同样如此)
  3. 获得输出,如结果所示。
  4. 我已经为一条扁平线做了这个,但我需要帮助为"snp:+[0-9]"制作函数,以便它对所有扁平线都做同样的事情。

    如何为"flat$"创建一个函数?

      

    代码

    flatcase

    我为flatCase尝试的功能是:

    flatcase
      

    是myDF

    normalCase <- function(x, ns) {
          ref.idx <- which(ns == "REF")
          ref.allele <- x[ref.idx]
          ref.count <- x[which(ns == ref.allele)]
    
          alt.idx <- which(ns == "ALT")
          alt.allele <- x[alt.idx]
          alt.count <- x[which(ns == alt.allele)]
    
          paste(ref.count, alt.count, sep=",")
        }
    
    
    
        flatcase??{
    
         g<-x[,"start"]=="chr16:2530921"& grepl("snp:+[0-9]",x[,"TYPE"])
         myt<-x[g,]
         x[g,"ALT"]
         unique(x[g,"ALT"])
         c<-unique(x[g,"ALT"])
         flat<-myt[grepl("flat$",myt[,"TYPE"]),]
         c<-unique(x[g,"ALT"])
        alt.count<- sum(as.numeric(flat[c]))
        }
    
        calculateAD <- function(x, mat, ns) {
          if (grepl("flat$", x[which(ns == 'TYPE')])) {
            flatCase(x, mat, ns)
          } else {
            normalCase(x, ns)
          }
        }
    
    
        bamAD <- function(x) {
           new.x <- cbind(x, apply(x, 1, calculateAD, x, colnames(x)))
          colnames(new.x)[ncol(new.x)] <- "bam.AD"
          new.x      
        }
    
      

    结果:

    flatCase <- function(x, mat, ns) {
      id.idx <- which(ns == 'start')
      type.idx <- which(ns == 'TYPE')
      ref.idx <- which(ns == 'REF')
      alt.idx <- which(ns == 'ALT')
    
    
      id <- x[id.idx]
      #m <- mat[mat[, id.idx] == id & mat[, type.idx] == "snp", ]
      #m <- mat[mat[, id.idx] == id & mat[, type.idx] == "snp", ]
      m<-mat[grepl(id,mat[, id.idx]) & grepl("snp:+[0-9]",mat[, type.idx]),]
      #flat<-mat[grepl("flat$",mat[, type.idx]),]
      ref.allele <- x[ref.idx]
      ref.count<-x[which(ns == ref.allele)]
    
    
      alt.count <- sum(apply(m, 1, function(x) as.numeric(x[which(ns == x[alt.idx])])))
      paste(ref.count, alt.count, sep=",") 
    }
    

2 个答案:

答案 0 :(得分:2)

这是一种完成所有操作的方法,矢量化。

首先,请注意,无论类型如何,REF都是相同的。 我们可以通过使用REF作为矩阵的坐标来快速查找,例如,第1行有REF C,所以如果我们查找坐标(1,&#34; C&#34;),我们得到该行的REF值。

# the REFs are the same regardless of TYPE
rownames(x) <- 1:nrow(x)
ref <- x[cbind(1:nrow(x), x[, 'REF'])]

查看cbind(1:nrow(x), x[, 'REF']):这只是一个坐标列表(row number, REF),我们用它来查找REF编号。

然后我们对ALT做同样的事情:

alt <- x[cbind(1:nrow(x), x[, 'ALT'])]

但是,我们必须确保如果类型是“平坦的”,我们会将所有其他ALT添加到&#39; flat&#39;行的ALT(只有你所说的唯一的ALT)。

首先,确定哪些行是平的:

which.flat <- grep('flat$', x[, 'TYPE'])

接下来,对于每个平行,使用相同的&#39;开始&#39;查找其他行的ALT。 (那是x[, 'start'] == x[i, 'start']位),并排除具有重复ALT的行(即x[, 'ALT'] != x[i, 'ALT']位)。这里i是当前扁线的索引。将它们全部添加到扁线的ALT中。 sapply只是为每条扁平线矢量化这一切。

# add the other alts to the alt of the 'flat' line.
alt[which.flat] <- as.numeric(alt[which.flat]) + sapply(which.flat,
    function (i) {
        sum(as.numeric(alt[ x[, 'start'] == x[i, 'start'] &
             x[, 'ALT'] != x[i, 'ALT'] ]))
    })

现在我们只是粘贴在一起:

x <- cbind(x, bam.AD=paste(ref, alt, sep=','))

结果和你的一样,除了我认为你犯了错误的第10行 - &#34; chr16:2533924&#34;而它的ALT是&#34; T&#34; (值13),所以bam.AD是&#34; 19,13&#34; (你有&#34; 19,42&#34;好像ALT是&#34; A&#34;,但它不是。)

如果你必须坚持你的问题中的函数形式(非常慢和低效!),它与我所做的基本相同(因此你可以在没有apply的情况下做到这一点调用并完全跳过循环):

flatCase&lt; - function(x,mat,ns){     #得到平行的alt     alt&lt; - as.numeric(x [x [&#39; ALT&#39;]])

# get the other rows with the same 'start' and different 'ALT'
xx <- mat[mat[, 'start'] == x['start'] & mat[, 'ALT'] != x['ALT'], ,drop=F]
if (nrow(xx) > 0) {
  # grab all the alts as done before
  rownames(xx) <- 1:nrow(xx)
  alt <- alt + sum(as.numeric(xx[cbind(1:nrow(xx), xx[, 'ALT'])]))
 }

ref <- x[x['REF']]
return(paste(ref, alt, sep=','))
}

然而,如前所述,如果你向上移动它,你上面的整个代码只会减少到几行,并且更快:

newBamAD <- function (x) {
    # the version above
    rownames(x) <- 1:nrow(x)
    ref <- x[cbind(1:nrow(x), x[, 'REF'])]
    alt <- x[cbind(1:nrow(x), x[, 'ALT'])]
    which.flat <- grep('flat$', x[, 'TYPE'])
    alt[which.flat] <- as.numeric(alt[which.flat]) + sapply(which.flat,
        function (i) {
            sum(as.numeric(alt[ x[, 'start'] == x[i, 'start'] &
                 x[, 'ALT'] != x[i, 'ALT'] ]))
        })
    cbind(x, bam.AD=paste(ref, alt, sep=','))
}

library(rbenchmark)
benchmark(
  bamAD=bamAD(x),
  newBamAD=newBamAD(x)
)
#       test replications elapsed relative user.self sys.self user.child sys.child
# 1    bamAD          100   0.082    3.905     0.072    0.004          0         0
# 2 newBamAD          100   0.021    1.000     0.020    0.000          0         0

矢量化版本快了近4倍。

答案 1 :(得分:2)

另一种方法:

# create dataframe
mydf <- as.data.frame(x, stringsAsFactors=FALSE)
# create temporary values based on REF and ALT
mydf$REFval <- diag(as.matrix(mydf[, mydf$REF]))
mydf$ALTval <- diag(as.matrix(mydf[, mydf$ALT]))

在下一步中,你说要ALT&#34;如果ALT字母是唯一的&#34;但是,如果ALT相同但值不同,则没有指定使用哪个值。由于值是相同的,因此在样本数据集中没有关系,所以在我的代码中,我假设使用了最后一个ALT值。

# sum up ALT values for all start ID
require(dplyr)
mydfs <- mydf %>% group_by(start, ALT) %>%
  summarize(ALTkeep=last(ALTval)) %>%  # assume keep last one if same ALT
  group_by(start) %>%
  summarize(ALTflat=sum(as.numeric(ALTkeep)))

# merge back into main dataframe
mydf <- left_join(mydf, mydfs)
# select ALT value for bam.AD depending on "flat$" in TYPE
mydf$bam.AD <- with(mydf,
  paste(REFval, ifelse(grepl("flat$", TYPE), ALTflat, ALTval), sep=","))

# optional clean up of temporary values
mydf <- mydf[, !(names(mydf) %in% c("REFval", "ALTval", "ALTflat"))]

您想要的输出

                                   start  A  T  G  C REF ALT            TYPE bam.AD
1                          chr20:5363934 95 29 14 59   C   T             snp  59,29
2                           chr5:8529759 24  1 28 41   G   C             snp  28,41
3                          chr14:9620689 65 49 41 96   T   G             snp  49,41
4                           chr18:547375 94  1 51 67   G   C             snp  51,67
5                           chr8:5952145 27 80 25 96   T   T             snp  80,80
6                          chr14:8694382 68 94 26 30   A   A             snp  68,68
7                          chr16:2530921 49 15 79 72   A   T     snp:2530921  49,15
8                          chr16:2530921 49 15 79 72   A   G     snp:2530921  49,79
9                          chr16:2530921 49 15 79 72   A   T snp:2530921flat  49,94
10                         chr16:2533924 42 13 19 52   G   T snp:2533924flat  19,13
11                         chr16:2543344  4 13 13 42   G   T snp:2543344flat  13,55
12                         chr16:2543344 42 23 13 42   G   A     snp:2543344  13,42
13                         chr14:4214117 73 49 18 77   G   A             snp  18,73
14                          chr4:7799768 36 28  1 16   C   A             snp  16,36
15                          chr3:9141263 27 41 93 90   A   A             snp  27,27