如果在文件 A 的间隔中找到文件 B 的位置,则打印到新的数据帧
If position from File B is found in interval of file A, print to new dataframe
我有两个文件。
文件 A 具有间隔(基因组上的区域)
chr startpos endpos nMajor nMinor
1 1 762273 120612006 1 0
2 1 144854594 187610698 2 1
3 1 193051685 249120684 1 1
4 2 45895 242836535 1 1
5 3 361508 197566254 1 1
6 4 86022 190862182 1 1
文件 B 具有位置(突变)
mutation_id chr start end ref_counts var_counts
1 1_3649563_G/T 1 3649563 3649564 551 159
2 1_6196895_G/C 1 6196895 6196895 85 30
3 1_10678395_C/T 1 10678395 10678395 274 60
4 1_11090913_G/C 1 11090913 11090914 70 41
5 1_11772423_G/A 1 11772423 11772423 146 55
6 1_12316528_C/G 1 12316528 12316528 110 88
现在我想将这两个文件合并到文件 C,如果位置落在相应的区间内,则将文件 A 的 nMajor 和 nMinor 的信息添加到文件 B。
所以我需要先检查染色体是否相同,然后检查FileB中的开始和结束位置是否在FileA的区间内。
我的输出应该是:文件 C
mutation_id chr start end ref_counts var_counts nMajor nMinor
1 1_3649563_G/T 1 3649563 3649563 551 159 1 0
2 1_6196895_G/C 1 6196895 6196895 85 30 1 0
3 1_10678395_C/T 1 10678395 10678395 274 60 1 0
4 1_11090913_G/C 1 11090913 11090913 70 41 1 0
5 1_11772423_G/A 1 11772423 11772423 146 55 1 0
6 1_12316528_C/G 1 12316528 12316528 110 88 1 0
对于无法在FileB的区间内找到的行,我想打印“X”作为占位符。
您可以使用 fuzzyjoin
完成此任务:
library(dplyr)
library(fuzzyjoin)
file_b %>%
fuzzy_left_join(file_a,
by = c("chr" = "chr",
"start" = "startpos",
"end" = "endpos",
"start" = "endpos",
"end" = "startpos"),
match_fun = list(`==`, `>`, `<`, `<`, `>`)) %>%
select(-startpos, -endpos, -chr.y) %>%
rename(chr = chr.x)
我没有为 non-match 创建 X
,因为这会破坏 nMajor
、nMinor
列的 class 并将它们转换为一个string/character。我认为这不是个好主意,NA
值很容易处理。
这个returns
# A tibble: 7 x 8
mutation_id chr start end ref_counts var_counts nMajor nMinor
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1_3649563_G/T 1 3649563 3649564 551 159 1 0
2 1_6196895_G/C 1 6196895 6196895 85 30 1 0
3 1_10678395_C/T 1 10678395 10678395 274 60 1 0
4 1_11090913_G/C 1 11090913 11090914 70 41 1 0
5 1_11772423_G/A 1 11772423 11772423 146 55 1 0
6 1_12316528_C/G 1 12316528 12316528 110 88 1 0
7 ABC 2 123 456 2 3 NA NA
数据
file_a <- structure(list(chr = c(1, 1, 1, 2, 3, 4), startpos = c(762273,
144854594, 193051685, 45895, 361508, 86022), endpos = c(120612006,
187610698, 249120684, 242836535, 197566254, 190862182), nMajor = c(1,
2, 1, 1, 1, 1), nMinor = c(0, 1, 1, 1, 1, 1)), row.names = c(NA,
-6L), class = c("tbl_df", "tbl", "data.frame"))
在 file_b
中,我添加了一个假数据集来引发 non-match:
file_b <- structure(list(mutation_id = c("1_3649563_G/T", "1_6196895_G/C",
"1_10678395_C/T", "1_11090913_G/C", "1_11772423_G/A", "1_12316528_C/G",
"ABC"), chr = c(1, 1, 1, 1, 1, 1, 2), start = c(3649563, 6196895,
10678395, 11090913, 11772423, 12316528, 123), end = c(3649564,
6196895, 10678395, 11090914, 11772423, 12316528, 456), ref_counts = c(551,
85, 274, 70, 146, 110, 2), var_counts = c(159, 30, 60, 41, 55,
88, 3)), row.names = c(NA, -7L), class = c("tbl_df", "tbl", "data.frame"
))
我有两个文件。
文件 A 具有间隔(基因组上的区域)
chr startpos endpos nMajor nMinor
1 1 762273 120612006 1 0
2 1 144854594 187610698 2 1
3 1 193051685 249120684 1 1
4 2 45895 242836535 1 1
5 3 361508 197566254 1 1
6 4 86022 190862182 1 1
文件 B 具有位置(突变)
mutation_id chr start end ref_counts var_counts
1 1_3649563_G/T 1 3649563 3649564 551 159
2 1_6196895_G/C 1 6196895 6196895 85 30
3 1_10678395_C/T 1 10678395 10678395 274 60
4 1_11090913_G/C 1 11090913 11090914 70 41
5 1_11772423_G/A 1 11772423 11772423 146 55
6 1_12316528_C/G 1 12316528 12316528 110 88
现在我想将这两个文件合并到文件 C,如果位置落在相应的区间内,则将文件 A 的 nMajor 和 nMinor 的信息添加到文件 B。
所以我需要先检查染色体是否相同,然后检查FileB中的开始和结束位置是否在FileA的区间内。
我的输出应该是:文件 C
mutation_id chr start end ref_counts var_counts nMajor nMinor
1 1_3649563_G/T 1 3649563 3649563 551 159 1 0
2 1_6196895_G/C 1 6196895 6196895 85 30 1 0
3 1_10678395_C/T 1 10678395 10678395 274 60 1 0
4 1_11090913_G/C 1 11090913 11090913 70 41 1 0
5 1_11772423_G/A 1 11772423 11772423 146 55 1 0
6 1_12316528_C/G 1 12316528 12316528 110 88 1 0
对于无法在FileB的区间内找到的行,我想打印“X”作为占位符。
您可以使用 fuzzyjoin
完成此任务:
library(dplyr)
library(fuzzyjoin)
file_b %>%
fuzzy_left_join(file_a,
by = c("chr" = "chr",
"start" = "startpos",
"end" = "endpos",
"start" = "endpos",
"end" = "startpos"),
match_fun = list(`==`, `>`, `<`, `<`, `>`)) %>%
select(-startpos, -endpos, -chr.y) %>%
rename(chr = chr.x)
我没有为 non-match 创建 X
,因为这会破坏 nMajor
、nMinor
列的 class 并将它们转换为一个string/character。我认为这不是个好主意,NA
值很容易处理。
这个returns
# A tibble: 7 x 8
mutation_id chr start end ref_counts var_counts nMajor nMinor
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1_3649563_G/T 1 3649563 3649564 551 159 1 0
2 1_6196895_G/C 1 6196895 6196895 85 30 1 0
3 1_10678395_C/T 1 10678395 10678395 274 60 1 0
4 1_11090913_G/C 1 11090913 11090914 70 41 1 0
5 1_11772423_G/A 1 11772423 11772423 146 55 1 0
6 1_12316528_C/G 1 12316528 12316528 110 88 1 0
7 ABC 2 123 456 2 3 NA NA
数据
file_a <- structure(list(chr = c(1, 1, 1, 2, 3, 4), startpos = c(762273,
144854594, 193051685, 45895, 361508, 86022), endpos = c(120612006,
187610698, 249120684, 242836535, 197566254, 190862182), nMajor = c(1,
2, 1, 1, 1, 1), nMinor = c(0, 1, 1, 1, 1, 1)), row.names = c(NA,
-6L), class = c("tbl_df", "tbl", "data.frame"))
在 file_b
中,我添加了一个假数据集来引发 non-match:
file_b <- structure(list(mutation_id = c("1_3649563_G/T", "1_6196895_G/C",
"1_10678395_C/T", "1_11090913_G/C", "1_11772423_G/A", "1_12316528_C/G",
"ABC"), chr = c(1, 1, 1, 1, 1, 1, 2), start = c(3649563, 6196895,
10678395, 11090913, 11772423, 12316528, 123), end = c(3649564,
6196895, 10678395, 11090914, 11772423, 12316528, 456), ref_counts = c(551,
85, 274, 70, 146, 110, 2), var_counts = c(159, 30, 60, 41, 55,
88, 3)), row.names = c(NA, -7L), class = c("tbl_df", "tbl", "data.frame"
))