我正在分析一个数据集,需要在两个版本的数据之间找到匹配的样本。它们(应该)包含相同的表达式数据,但它们具有不同的示例标识符。让我们假设第一个dataframe如下所示:
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可能如下所示:
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
每一个样本有一个额外的列,使基因表达中最接近的匹配对所有基因都有影响。但是额外的列必须基于所有的基因,而不是基于一个基因。
发布于 2022-10-26 13:47:00
这里有两个选择。在您的示例中,看起来总是有整数匹配,因此可以按整数加入。或者,您可以尝试提取最近的数字。我使用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
https://stackoverflow.com/questions/74208555
复制相似问题