This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Raw counts to TPM in R

Can someone verify if this R code for converting raw counts to TPM is correct?

#' @title Compute TPM for a read count matrix
#' @param dfr A numeric data.frame of read counts with samples (columns) and genes (rows).
#' @param len A vector of gene cds length equal to number of rows of dfr.
#' 
r_tpm <- function(dfr,len)
{
  dfr1 <- sweep(dfr,MARGIN=1,(len/10^4),`/`)
  scf <- colSums(dfr1)/(10^6)
  return(sweep(dfr1,2,scf,`/`))
}
rna-seq r

Do you have a reason for suspecting it's not? Have you tested it? What do your tests reveal?

1 answer

Use this code snippet from Michael Love (DESeq2 developer)

x <- counts.mat / gene.length
tpm.mat <- t( t(x) * 1e6 / colSums(x) )

Cool! I get the same result.

# michael's version
# https://support.bioconductor.org/p/91218/

tpm3 <- function(counts,len) {
  x <- counts/len
  return(t(t(x)*1e6/colSums(x)))
}

Michael's version is much faster despite all the transposes.

enter image description here

If an answer was helpful you should upvote it, if the answer resolved your question you should mark it as accepted.
Upvote|Bookmark|Accept

Log in to answer this question.