首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在基因表达数据中找到最接近的匹配

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

Stack Overflow用户
提问于 2022-10-26 13:22:15
回答 1查看 28关注 0票数 1

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

代码语言:javascript
运行
复制
   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

我为一个基因制作了数据,但你可以想象这是一个包含~20k基因的大数据集。我需要做的是找到基因表达中最接近的匹配点,这样我就知道哪些样本对应。第二个dataframe可能如下所示:

代码语言:javascript
运行
复制
   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很陌生,需要一点帮助。

我希望输出结果如下:

代码语言:javascript
运行
复制
   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 

每一个样本有一个额外的列,使基因表达中最接近的匹配对所有基因都有影响。但是额外的列必须基于所有的基因,而不是基于一个基因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-26 13:47:00

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

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74208555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档