在基因表达数据中找到最接近的匹配

  • 本文关键字:最接近 数据 r
  • 更新时间 :
  • 英文 :


我正在分析一个数据集,需要在两个版本的数据之间找到匹配的样本。它们(应该(包含相同的表达式数据,但它们具有不同的样本标识符。假设第一个数据帧如下:

gene sample expression
1     a      a          1
2     a      b          2
3     a      c          3
4     a      d          4
5     a      e          5
6     a      f          6
7     a      g          7
8     a      h          8
9     a      i          9
10    a      j         10
11    a      k         11
12    a      l         12
13    a      m         13
14    a      n         14

我为一个基因制作了数据框架,但你可以想象这是一个包含约2万个基因的大型数据集。我需要做的是找到基因表达最接近的匹配,这样我就知道哪些样本对应。第二个数据帧可能看起来像这样:

gene sample expression
1     a      z        1.5
2     a      y        2.5
3     a      x          3
4     a      w        4.5
5     a      v        5.7
6     a      u        6.2
7     a      t        7.8
8     a      s        8.1
9     a      r        9.8
10    a      q       10.5
11    a      p         11
12    a      o         12
13    a      2       13.3
14    a      4       14.4

我需要做的是编写一个函数(或类似的东西(,尝试尽可能紧密地匹配数据帧中的基因表达(对于所有基因(,并报告最匹配的样本标识符。我对R很陌生,需要一些帮助。

我希望输出看起来像这样::

gene sample expression sample2
1     a      z          1       z
2     a      y          2       y
3     a      x          3       x
4     a      w          4       w
5     a      v          5       v
6     a      u          6       u
7     a      t          7       t
8     a      s          8       s
9     a      r          9       r
10    a      q         10       q
11    a      p         11       p
12    a      o         12       o
13    a      2         13       2
14    a      4         14       4 

每个样本的一个额外的柱,用于分离所有基因的基因表达最接近的匹配。但额外的列必须基于所有基因而不是一个基因创建。

这里有两个选项。在您的示例中,看起来总是有整数匹配,所以您可以按整数加入。或者,您可以尝试提取最接近的数字。我使用floor是因为看起来您希望1.5连接到1而不是2。

library(tidyverse)

#extract closest whole number
df1 |>
mutate(sample2 = map_chr(expression, 
(x)df2$sample[which.min(abs(x - floor(df2$expression)))]))
#> # A tibble: 14 x 4
#>    gene  sample expression sample2
#>    <chr> <chr>       <dbl> <chr>  
#>  1 a     a               1 z      
#>  2 a     b               2 y      
#>  3 a     c               3 x      
#>  4 a     d               4 w      
#>  5 a     e               5 v      
#>  6 a     f               6 u      
#>  7 a     g               7 t      
#>  8 a     h               8 s      
#>  9 a     i               9 r      
#> 10 a     j              10 q      
#> 11 a     k              11 p      
#> 12 a     l              12 o      
#> 13 a     m              13 2      
#> 14 a     n              14 4
#join by whole number
left_join(df1, 
df2 |>
mutate(expression = as.numeric(gsub("^(.*)\.\d+$", "\1", expression))) |>
select(sample2 = sample, expression),
by = "expression")
#> # A tibble: 14 x 4
#>    gene  sample expression sample2
#>    <chr> <chr>       <dbl> <chr>  
#>  1 a     a               1 z      
#>  2 a     b               2 y      
#>  3 a     c               3 x      
#>  4 a     d               4 w      
#>  5 a     e               5 v      
#>  6 a     f               6 u      
#>  7 a     g               7 t      
#>  8 a     h               8 s      
#>  9 a     i               9 r      
#> 10 a     j              10 q      
#> 11 a     k              11 p      
#> 12 a     l              12 o      
#> 13 a     m              13 2      
#> 14 a     n              14 4

最新更新