首页 > 解决方案 > 基于从查找表中搜索向数据框中添加新的基因名称列

问题描述

我对在 R 中工作非常陌生,昨天大部分时间都在试图从这里的其他问题和指南中弄清楚这一点,而没有走得太远。

我有一个RNAseq 表达值表及其 transcript_id(例如 TraesCS5B02G127900.1)。我想通过在transcript_id (例如TraesCS5B02G127900)中搜索gene_id 的查找表向该表添加一个新列,并在新列中添加相应的Gene.name(例如ENA1)和gene_id。

这是我的表达式表的一部分(包含更多行):

          transcript_id sigma_sq_pmax   iqr failed_ise 
1  TraesCS1B02G306500.1  9.259216e-01  TRUE      FALSE
2  TraesCS1B02G433800.1  0.000000e+00 FALSE      FALSE
3  TraesCS2A02G284700.1  0.000000e+00 FALSE      FALSE
4  TraesCS2A02G336600.1  1.582308e-02 FALSE      FALSE
5  TraesCS2A02G390800.1  2.236139e-01 FALSE      FALSE
6  TraesCS2A02G391000.1  4.609996e-01  TRUE      FALSE
7  TraesCS2A02G391000.2  4.378863e+00 FALSE      FALSE
8  TraesCS2A02G391000.3  0.000000e+00 FALSE      FALSE
9  TraesCS2A02G410400.1  0.000000e+00 FALSE      FALSE
10 TraesCS2A02G424200.2  3.831211e-01  TRUE      FALSE

这是我的查找表的一部分,其中包含我的gene_id 和gene.names(再次包含更多行):

           Gene.name            gene_id
1               ENA1 TraesCS5B02G127900
2               ENA1 TraesCS5D02G136800
3               ENA1 TraesCS5A02G129300
4  ENA2/OS10G0434900 TraesCS7A02G427700
5  ENA2/OS10G0434900 TraesCS4A02G414400
6  ENA2/OS10G0434900 TraesCS4B02G315100
7  ENA2/OS10G0434900 TraesCS4D02G332100
8  ENA2/OS10G0434900 TraesCS4B02G336400
9  ENA2/OS10G0434900 TraesCS7D02G420100
10 ENA2/OS10G0434900 TraesCS7B02G327900

我想创建一个新表,通过搜索其中包含gene_id的transcript_id将Gene.namegene_id列添加到表达式表中。

例如,这就是我希望它看起来的样子:

   Gene.name            gene_id            target_id sigma_sq_pmax   iqr failed_ise
1     OsZIP5 TraesCS1B02G306500 TraesCS1B02G306500.1    0.92592155  TRUE      FALSE
2    OsABCC1 TraesCS1B02G433800 TraesCS1B02G433800.1    0.00000000 FALSE      FALSE
3     OsYSL6 TraesCS2A02G284700 TraesCS2A02G284700.1    0.00000000 FALSE      FALSE
4     OsVIT1 TraesCS2A02G336600 TraesCS2A02G336600.1    0.01582308 FALSE      FALSE
5    OsYSL16 TraesCS2A02G390800 TraesCS2A02G390800.1    0.22361394 FALSE      FALSE
6     OsYSL9 TraesCS2A02G391000 TraesCS2A02G391000.1    0.46099961  TRUE      FALSE
7     OsYSL9 TraesCS2A02G391000 TraesCS2A02G391000.2    4.37886316 FALSE      FALSE
8     OsYSL9 TraesCS2A02G391000 TraesCS2A02G391000.3    0.00000000 FALSE      FALSE
9     OsHMA5 TraesCS2A02G410400 TraesCS2A02G410400.1    0.00000000 FALSE      FALSE
10    OsZIP3 TraesCS2A02G424200 TraesCS2A02G424200.2    0.38312110  TRUE      FALSE

我非常感谢您对此的任何帮助,谢谢:)

标签: rdataframe

解决方案


一种tidyverse方法可能看起来像这样。第一步涉及transcript_id在包含 的列中进行分离,gene_id然后 使用。在第二步中,您可以使用加入表达式并查找表。但是,该列仅包含s,因为在给定的示例数据中不匹配。no.tidyr::separategene_iddplyr::left_joinGene.nameNA

library(dplyr)
library(tidyr)

expression_table %>% 
  tidyr::separate(transcript_id, into = c("gene_id", "no"), sep = "\\.", remove = FALSE) %>% 
  dplyr::left_join(lookup_table)
#> Joining, by = c("row", "gene_id")
#> Warning: Column `gene_id` joining character vector and factor, coercing into
#> character vector
#>    row        transcript_id            gene_id no sigma_sq_pmax   iqr
#> 1    1 TraesCS1B02G306500.1 TraesCS1B02G306500  1    0.92592160  TRUE
#> 2    2 TraesCS1B02G433800.1 TraesCS1B02G433800  1    0.00000000 FALSE
#> 3    3 TraesCS2A02G284700.1 TraesCS2A02G284700  1    0.00000000 FALSE
#> 4    4 TraesCS2A02G336600.1 TraesCS2A02G336600  1    0.01582308 FALSE
#> 5    5 TraesCS2A02G390800.1 TraesCS2A02G390800  1    0.22361390 FALSE
#> 6    6 TraesCS2A02G391000.1 TraesCS2A02G391000  1    0.46099960  TRUE
#> 7    7 TraesCS2A02G391000.2 TraesCS2A02G391000  2    4.37886300 FALSE
#> 8    8 TraesCS2A02G391000.3 TraesCS2A02G391000  3    0.00000000 FALSE
#> 9    9 TraesCS2A02G410400.1 TraesCS2A02G410400  1    0.00000000 FALSE
#> 10  10 TraesCS2A02G424200.2 TraesCS2A02G424200  2    0.38312110  TRUE
#>    failed_ise Gene.name
#> 1       FALSE      <NA>
#> 2       FALSE      <NA>
#> 3       FALSE      <NA>
#> 4       FALSE      <NA>
#> 5       FALSE      <NA>
#> 6       FALSE      <NA>
#> 7       FALSE      <NA>
#> 8       FALSE      <NA>
#> 9       FALSE      <NA>
#> 10      FALSE      <NA>

reprex 包(v0.3.0)于 2020-04-18 创建


推荐阅读