这是我第一次来这里,如果我做错了什么或弄错了,我深表歉意。我正在处理基因组数据,我有两个数据框:一个是关于一系列SNP的祖先的信息(见下表):
Chrom | Start | End | Ancestry
---------------------------------------
22 | 16495833 | 19868218 | EUR_Patag
22 | 19873357 | 21405110 | Patag_Patag
22 | 21416404 | 21449724 | Patag_UNK
22 | 21458082 | 23704421 | EUR_Patag
22 | 23712647 | 23717466 | Patag_UNK另一个数据帧包含有关每个rsID的阶段性基因型的信息(见下表):
Chrom | Pos | ID | Genot
---------------------------------------
22 | 16495833 | rs116823 | 0|1
22 | 16620701 | rs635455 | 0|0
22 | 16648658 | rs445724 | 1|1
22 | 16872459 | rs827345 | 1|0
22 | 16880098 | rs309287 | 1|1因此,我想用第一个数据帧分析来自第二个数据帧(通过"Pos“列)的每个SNP,评估这个特定SNP所在的范围,并用新列(在第二个数据帧中)分配祖先(根据SNP所在的范围)。
我正在寻找解决方案,我发现R中的库数据表能够处理这个问题,但不幸的是我无法找到解决方案。
我希望能对我的问题有一个很好的理解。非常感谢您的帮助
发布于 2017-07-29 07:00:31
我认为我们可以将其作为重叠连接来实现。重叠连接在一个间隔上连接,在本例中我们有一个间隔和一个位置。从技术上讲,位置是长度为0的区间,所以我们仍然可以这样做。
require(data.table)
setDT(df1)
setDT(df2)
#create a duplicate of the position so we have our "interval"
df2[, Pos2:= Pos]
setkey(df1, Start, End)
outDF <- foverlaps(df2,df1, by.x=c("Pos","Pos2"),by.y=c("Start","End"),
type="within", mult="all")输出(将另一行22 23712650 rs309884 1|1 23712650添加到df2以进一步验证)
Chrom Start End Ancestry V1 Pos ID Genot Pos2
1: 22 16495833 19868218 EUR_Patag 22 16495833 rs116823 0|1 16495833
2: 22 16495833 19868218 EUR_Patag 22 16620701 rs635455 0|0 16620701
3: 22 16495833 19868218 EUR_Patag 22 16648658 rs445724 1|1 16648658
4: 22 16495833 19868218 EUR_Patag 22 16872459 rs827345 1|0 16872459
5: 22 16495833 19868218 EUR_Patag 22 16880098 rs309287 1|1 16880098
6: 22 23712647 23717466 Patag_UNK 22 23712650 rs309884 1|1 23712650df1和df2与您列出的顺序相对应。
我在引用here时使用的示例
https://stackoverflow.com/questions/45381716
复制相似问题