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