【发布时间】:2020-11-06 19:15:10
【问题描述】:
我有一个基因数据集,我想在其中对基因组中物理上靠近的基因变异/行进行分组。我想对每条染色体与基因组中某些点 500 +/- 距离内的基因进行分组。
我的 'spots' 数据集是变体需要在 500 +/- 范围内的位置,并且看起来像:
chrom min max low high
1 1000 1200 500 1700
1 20000 20100 19500 20600
5 900 1000 400 1500
我的low 和high 列是我想查看下一个数据集中是否有任何行落入的范围,同时还考虑到染色体也必须匹配。
我的其他数据集有一个 position 值,我正在查看它是否符合上述任何范围并匹配 chrom:
Gene chrom position
Gene1 1 1200
Gene2 1 10000
Gene3 5 500
Gene4 1 560
Gene5 1 20100
我尝试使用 group_by() 和 between() 来设置范围,但我正在努力考虑需要在之前的数据集之间匹配染色体 (chrom) 然后搜索范围。
输出如下:
Gene chrom position Group
Gene1 1 1200 1 #position is in one of the ranges so is in a group
Gene2 1 10000 NA
Gene3 5 500 2 #position is in one of the ranges so is in a group
Gene4 5 560 2 #position is in the same range as above so joins that group
Gene5 1 20100 3 #position matches a chrom and range and so gets a group corresponding to that particular chrom and range
Gene3 和 Gene4 不在第 1 组,因为它们位于不同的chrom。
所以我正在创建一个Group 列,该列为同一染色体上同一范围内的所有行创建一个共享编号,或者如果它们的position 在第一个数据集中的任何范围内都不匹配,则为NA。理想情况下,我正在寻找 dplyr 解决方案,因为这是我通常使用的解决方案,但我的真实数据也非常大,因此任何有帮助的指导将不胜感激。
输入数据:
#df1
structure(list(chrom = c(1L, 1L, 5L),
min = c(1000L, 20000L, 900L), max = c(1200L, 20100L, 1000L
), low = c(500L, 19500L, 400L), high = c(1700L, 20600L, 1500L
)), row.names = c(NA, -3L), class = c("data.table", "data.frame"))
#df2
structure(list(Gene = c("Gene1", "Gene2", "Gene3", "Gene4", "Gene5"
), chrom = c(1L, 1L, 5L, 1L, 1L), position = c(1200L, 10000L,
500L, 560L, 20100L)), row.names = c(NA, -5L), class = c("data.table",
"data.frame"))
【问题讨论】:
-
现在没有任何意义。基因 3 和 4 中的 500 和 560 介于 500-1700 和 400-1500 之间。它们应该是唯一的,或者如果满足多个范围,您需要阐明如何选择“组”的另一个条件。到目前为止,您的问题还不清楚。
-
谢谢,我一直试图澄清这是由于基因 3 和 4 在另一个
chrom上,所以如果chrom数字不同,它们应该被考虑在一个唯一的范围内以匹配chrom号码优先。这也是我在我的问题中坚持的主要部分,我不知道如何通过chrom有条件地分离范围考虑
标签: r dplyr data.table