This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Convert Human to Mouse Symbols

I'm trying to create a working function that takes a column of human gene symbols as input and outputs a vector of mouse gene symbols that is the same length. (I'm trying to use the function to replace the human genes in a dataframe with mouse genes)

I have tried this function using biomart and tried two mirrors but I'm getting connectivity issues.

convertHumanGeneList <- function(x){

  library("biomaRt")
  human <- useMart("ensembl", dataset = "hsapiens_gene_ensembl", host="useast.ensembl.org")
  mouse <- useMart("ensembl", dataset = "mmusculus_gene_ensembl", host="useast.ensembl.org")

  genesV2 <- getLDS(attributes = c("hgnc_symbol"), filters = "hgnc_symbol", 
                    values = x , mart = human, attributesL = c("mgi_symbol"), martL = mouse, uniqueRows=T)

  humanx <- unique(genesV2[, 2])

  return(humanx)
}

I've also tried using this function, which works for some simple vectors but not longer ones:

mouse_human_genes = read.csv("http://www.informatics.jax.org/downloads/reports/HOM_MouseHumanSequence.rpt",sep="\t")

convert_human_to_mouse <- function(gene_list){

  output = c()

  for(gene in gene_list){
    class_key = (mouse_human_genes %>% filter(Symbol == gene & Common.Organism.Name=="human"))[['DB.Class.Key']]
    if(!identical(class_key, integer(0)) ){
      human_genes = (mouse_human_genes %>% filter(DB.Class.Key == class_key & Common.Organism.Name=="mouse, laboratory"))[,"Symbol"]
      for(human_gene in human_genes){
        output = append(output,human_gene)
      }
    }
  }

  return (output)
}

> mouse_symbols <- convert_human_to_mouse(human_symbols)
There were 14 warnings (use warnings() to see them)
> warnings()
Warning messages:
1: In DB.Class.Key == class_key :
longer object length is not a multiple of shorter object length

If I try to use this function to replace genes in my dataframe, I get:

Error in `$<-.data.frame`(`*tmp*`, TG, value = c("Trim71", "Dppa4", "Sfrp2",  : 
  replacement has 3882 rows, data has 3957

(probably because it's not able to convert all the human genes to mouse)

biomart r gene-symbols

3 answers

Without using convoluted loops, and using your list of genes (HOM_MouseHumanSequence.rpt) you can

mouse_human_genes <- read.csv("http://www.informatics.jax.org/downloads/reports/HOM_MouseHumanSequence.rpt",sep="\t"

# separate human and mouse 
mouse <- split.data.frame(mouse_human_genes,mouse_human_genes$Common.Organism.Name)[[2]]
human <- split.data.frame(mouse_human_genes,mouse_human_genes$Common.Organism.Name)[[1]]

# remove some columns
mouse <- mouse[,c(1,4)]
human <- human[,c(1,4)]

# merge the 2 dataset  (note that the human list is longer than the mouse one)
mh_data <- merge.data.frame(mouse,human,by = "DB.Class.Key",all.y = TRUE) 

> head(mh_data)
    DB.Class.Key Symbol.x Symbol.y
1     44220139    Wdr53    WDR53
2     44220140      Tdg      TDG
3     44220141   Trarg1   TRARG1
4     44220142    Pdgfb    PDGFB
5     44220143   Gpr171   GPR171
6     44220144  Glyatl3  GLYATL3
...

I am not sure where I found this code but I am using this since very long for the gene symbol conversion. If I find the original source of this code I will update my answer for acknowledgment, but you can use this one and it is working quite well for me,

convert_mouse_to_human <- function(gene_list) { 
     output = c()
     mouse_human_genes = read.csv("https://www.informatics.jax.org/downloads/reports/HOM_MouseHumanSequence.rpt",sep="\t")

     for(gene in gene_list) {
          class_key = (mouse_human_genes %>% filter(Symbol == gene & Common.Organism.Name == "mouse, laboratory"))[['DB.Class.Key']]
          if( !identical(class_key, integer(0)) ) {
               human_genes = (mouse_human_genes %>% filter(DB.Class.Key == class_key & Common.Organism.Name=="human"))[,"Symbol"]
               for(human_gene in human_genes) {
                    output = rbind(c(gene, human_gene), output)
               }
          }
     }
     return (output)
}

convert_human_to_mouse <- function(gene_list) {
    output = c()
    mouse_human_genes = read.csv("https://www.informatics.jax.org/downloads/reports/HOM_MouseHumanSequence.rpt",sep="\t")

    for(gene in gene_list) {
          class_key = (mouse_human_genes %>% filter(Symbol == gene & Common.Organism.Name == "human"))[['DB.Class.Key']]
          if( !identical(class_key, integer(0)) ) {
            human_genes = (mouse_human_genes %>% filter(DB.Class.Key == class_key & Common.Organism.Name=="mouse, laboratory"))[,"Symbol"]
            for(human_gene in human_genes) {
                output = rbind(c(gene, human_gene), output)
            }
          }
     }
     return (output)
}

It uses orthologous gene pairs for mouse and human provide by MGI database.

NOTE: The same strategy has been used elsewhere and implemented in python, here you can find the code

All the best :)

Regards,

Nitin N.

you can use this table https://gist.github.com/crazyhottommy/4e46298045a329b47669

Thank you, this works for the most part. I noticed this doesn't have the gene Pou5f1 / also known as Oct4, is that correct?

Log in to answer this question.