我正在分析一個資料集,需要在 2 個資料版本之間找到匹配的樣本。它們(應該)包含相同的運算式資料,但它們具有不同的樣本識別符號。假設第一個資料框如下所示:
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
每個樣本有一個額外的列,用于區分所有基因的基因表達中最接近的匹配。但是必須基于所有基因而不是一個基因創建額外的列。
uj5u.com熱心網友回復:
這里有兩個選項。在您的示例中,看起來總是有整數匹配,因此您可以按整數加入。或者,您可以嘗試提取最接近的數字。我使用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://www.uj5u.com/gongcheng/520927.html
標籤:r
上一篇:geom_text百分比標簽:使用facet_wrap或facet_grid時如何做到這一點?
下一篇:嵌套資料框后變數的平均值
