微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何根据另一个数据集设置的条件对行进行分组?

如何解决如何根据另一个数据集设置的条件对行进行分组?

我已尝试根据类似问题编写对此的答案,但是我很难找到适合我的用例的任何答案。

我有 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 列值在 PositionMaxMin 列之间的范围内,那么如果为该行分配相同的 {{ 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.tableA[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 ...

有了这个,我建议两个步骤:

  1. 因为范围连接会导致您的一个非对等连接列被重命名,所以我会将 Position 保存到一个新变量中并改用它。会洗掉的。

  2. 反转对象。

因此,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。