问题描述
我已尝试根据类似问题编写对此的答案,但是我很难找到适合我的用例的任何答案。
我有 2 个遗传数据集(查看基因组中突变的位置)。
这些看起来像:
#df1:
Chromosome Min Max Group
1 500 1000 1
1 400 1900 2
2 300 400 3
3 2000 2100 4
#df2
Gene Chromosome Position
Gene1 1 600
Gene1 1 650
Gene2 1 1700
Gene3 2 350
Gene4 2 355
Gene5 2 450
Gene6 3 2050
我正在寻找 df2
中的哪些行属于 Group
中的 df1
- 所以我正在编码以询问 df2
中的一行是否具有匹配的 { {1}} 编号且 Chromosome
列值在 Position
的 Max
和 Min
列之间的范围内,那么如果为该行分配相同的 {{ df1
中的 1}} 个数字。如果 Group
出现在多个组中,我希望这也复制它们。
示例的预期输出是:
df1
我想知道的关键是 df2
中的某些组在其最小-最大范围内有重叠,但我仍然希望保留每个单独的组,并且只保留基因/行的 Gene Chromosome Position Group
Gene1 1 600 1
Gene1 1 650 1
Gene1 1 600 2
Gene1 1 650 2
Gene2 1 1700 2
Gene3 2 350 3
Gene4 2 355 3
Gene5 2 450 NA
Gene6 3 2050 4
#Gene1 enters both groups 1 and 2 as their Chromosome and Position fits in both those groups of df1
被复制,因为它们的位置可能匹配多个重叠的组。
目前我正在尝试使用以下代码进行编码:
df1
对于我的例子,这个输出:
df2
所以在这种情况下,因为第 1 组和第 2 组在其最小-最大范围内有重叠,所以第 1 组已从输出结果中丢失。是否有另一种方法可以编码来避免这种情况并匹配行,但尽管有任何范围重叠,但仍保留所有 df1$ID <- seq.int(nrow(df1))
df2$ID<- seq.int(nrow(df2))
df2[df1,Group := i.ID,on = .(Chromosome,Position > Min,Position < Max ) ]
?
我尝试了其他方法来使用 Gene Chromosome Position ID Group
Gene1 1 600 1 2
Gene1 1 650 2 2
Gene2 1 1700 3 2
Gene3 2 350 4 3
Gene4 2 355 5 3
Gene5 2 450 6 NA
Gene6 3 2050 7 4
对类似问题 (How to perform join over date ranges using data.table?) 进行编码,但这也无法按预期工作。
输入数据:
Groups
解决方法
你在寻找这样的东西吗?
setDT(df1)
setDT(df2)
df2[,Group := df1[.SD,on = .(Chromosome = Chromosome,Max > Position,Min < Position),toString(Group),by = .EACHI]$V1]
# Gene Chromosome Position Group
# 1: Gene1 1 600 1,2
# 2: Gene1 1 650 1,2
# 3: Gene2 1 1700 2
# 4: Gene3 2 350 3
# 5: Gene4 2 355 3
# 6: Gene5 2 450 NA
# 7: Gene6 3 2050 4
,
data.table
的 A[B,...]
合并表示法在 A 上执行 B 的左连接 ... 向后到眼睛。它的等价物:
- 基础 R:
merge(A,B,all.x = FALSE,all.y = TRUE,...)
- dplyr:
dplyr::right_join(A,...)
或dplyr::left_join(B,A,...)
- SQL:
... FROM B left join A ...
有了这个,我建议两个步骤:
-
因为范围连接会导致您的一个非对等连接列被重命名,所以我会将
Position
保存到一个新变量中并改用它。会洗掉的。 -
反转对象。
因此,
df1[df2[,Pos0:=Position],on = .(Chromosome,Min < Pos0,Max > Pos0 ) ][,.(Gene,Chromosome,Position,Group)]
# Gene Chromosome Position Group
# <char> <int> <int> <int>
# 1: Gene1 1 600 1
# 2: Gene1 1 600 2
# 3: Gene1 1 650 1
# 4: Gene1 1 650 2
# 5: Gene2 1 1700 2
# 6: Gene3 2 350 3
# 7: Gene4 2 355 3
# 8: Gene5 2 450 NA
# 9: Gene6 3 2050 4