r - 在 R 中按范围合并 - 应用循环

标签 r loops merge genetics

我在这里发布了一个问题:Matched Range Merge in R关于根据一个文件中落入第二个文件范围内的数字合并两个文件。到目前为止,我还没有成功地拼凑代码来实现这一目标。我遇到的问题是我使用的代码逐行比较文件。这是一个问题,因为 1.) 一个文件比另一个文件长得多,并且 2.) 我需要在较长文件中的每个范围对中扫描较短文件中的行 - 而不仅仅是同一行中的范围.

我一直在使用原始问题中发布的函数,我觉得应该有一种方法可以将它应用于更通用的循环,将第一个文件中的每一行与第二个文件中的每一行进行比较,但我没有t想通了。如果有人有任何建议,我将不胜感激。

**** 编辑。

数据的性质是这样的:每个范围不一定是唯一的,尽管大多数都是。它们的大小也不相同,有些完全属于其他。 findInterval因此会产生错误,因为无法按“非降序”顺序对范围进行排序。

这是每个数据帧的前 6 行:

file1test <- data.frame(SNP=c("rs2343", "rs211", "rs754", "rs854", "rs343", "rs626"), BP=c(860269, 369640, 861822, 367934, 706940, 717244))


file2 <- data.frame(Gene=c("E613", "E92", "E49", "E3543", "E11", "E233"), BP_start=c(367640, 621059, 721320, 860260, 861322, 879584), BP_end = c(368634, 622053, 722513, 879955, 879533, 894689))

因此,如您所见,第 5 行的范围位于第 4 行的范围内,第一个文件中的两个 SNP 位于第 4 行的范围内,但只有一个位于第二行的范围内。

第一个包含 SNP 的文件只有约 400 行。然而,包含范围的第二个文件大约有 20K。我想作为输出生成的是一个数据框,其中包含第一个文件(SNP)中的行,其中 BP 属于第二个文件中的 BP 范围。如果一个 SNP 落入两个范围,那么它会出现两次,依此类推。

最佳答案

我相信您要的是 conditional join .它们在 SQL 中很容易,而且 sqldf包使使用 SQL 查询 R 中的数据帧变得容易。

只需根据您希望如何处理不匹配的 SNP 来选择一个版本。

内连接版本:

> sqldf("select * from file1test f1 inner join file2 f2 
+       on (f1.BP > f2.BP_start and f1.BP<= f2.BP_end) ")

输出:
     SNP     BP  Gene BP_start BP_end
1 rs2343 860269 E3543   860260 879955
2  rs754 861822 E3543   860260 879955
3  rs754 861822   E11   861322 879533
4  rs854 367934  E613   367640 368634
> 

左加入版本:
> sqldf("select * from file1test f1 left join file2 f2 
+       on (f1.BP > f2.BP_start and f1.BP<= f2.BP_end) ")

输出:
     SNP     BP  Gene BP_start BP_end
1 rs2343 860269 E3543   860260 879955
2  rs211 369640  <NA>       NA     NA
3  rs754 861822 E3543   860260 879955
4  rs754 861822   E11   861322 879533
5  rs854 367934  E613   367640 368634
6  rs343 706940  <NA>       NA     NA
7  rs626 717244  <NA>       NA     NA
> 

请注意,您可能需要小心放置 = 的位置。如果在 BP 与 BP_start 或 BP_end 完全匹配的情况下,BP 属于哪个组很重要。

关于r - 在 R 中按范围合并 - 应用循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11892241/

相关文章:

java - 如何以最快的方式将两个排序数组相交?

r - 通过 R 中的唯一 ID 和最接近日期对数据框进行子集化

r - 根据条件和列名称改变乘法列

r - R 中的子矩阵采样

git - 仅 merge git 分支中的增量更改

merge 成功后 Git rebase 冲突?

r - 根据条件将一个表中的值附加到另一个表中

list - 循环遍历 Perl 中的列表

c - C语言中的fgets在获取字符串后多次打印

javascript - 相当于 Ruby 的 Enumerable#cycle 的 JavaScript 是什么?