检查位置相交并根据 P 值有条件地删除行

Examining position intersect and conditionally drop row based on P-values

我正在研究 post-GWAS 分析,我在其中定义了与我的特征相关的独立 SNP 列表。 我正在尝试对我的 indep 进行分组。 +- 500KB 基因座中的 SNP。有一些独立的 SNP,它们的基因座会相互重叠,如果两个基因座重叠,我正在尝试编写一个代码来删除具有较高 P 值的 SNP。

   SNP       bp            p
1: rs1  8537289  1.33785e-08
2: rs2  12263919 5.03939e-11
3: rs3  19771438 1.83669e-20
4: rs4  19845279 3.60144e-18

然后添加位置为 +- 500kb 的两列,很明显,第 3 行和第 4 行具有重叠的基因组位置。

   SNP       bp           p    start     stop
1: rs1  8537289 1.33785e-08  8037289  9037289
2: rs2 12263919 5.03939e-11 11763919 12763919
3: rs3 19771438 1.83669e-20 19271438 20271438
4: rs4 19845279 3.60144e-18 19345279 20345279

我从这里开始尝试做的是进入条件代码,这将使 SNP 保持最低 P 值(在本例中为 rs3),然后删除包含 rs4 的第四行.

所以我会得到以下结果:

  SNP       bp           p    start     stop
1: rs1  8537289 1.33785e-08  8037289  9037289
2: rs2 12263919 5.03939e-11 11763919 12763919
3: rs3 19771438 1.83669e-20 19271438 20271438

我很清楚 plink 聚集是定义位点的常用程序,但我正在尝试将其作为建立与特征关联的替代和可靠方法。我希望有人愿意分享他们的绝妙技能,我保证 return 中的善业。干杯

编辑

查看结果,我注意到@Axeman 提供的出色解决方案产生了无意的错误。如果我没有正确表达自己,我深表歉意。 我 运行 以下代码打印“g 列”而不丢弃 SNP

d1 <- d %>% group_by(Chr,p, locus = cumsum(minus > lag(plus, default=1)))
%>% slice_min(p)

并且注意到当染色体从n变为n2时,非重叠的基因组区域被合并到一个基因座中。因此染色体 n 的最后一个基因座和 n2 的第一个基因座被“合并”(或丢弃)。您知道如何解决吗?

您可以为重叠部分定义组,然后筛选最低 p 值。例如:

library(dplyr)
d %>% 
  group_by(g = cumsum(start > lag(stop, default = 1))) %>% 
  slice_min(p)
# A tibble: 3 × 6
# Groups:   g [3]
  SNP         bp        p    start     stop     g
  <chr>    <int>    <dbl>    <int>    <int> <int>
1 rs1    8537289 1.34e- 8  8037289  9037289     1
2 rs2   12263919 5.04e-11 11763919 12763919     2
3 rs3   19771438 1.84e-20 19271438 20271438     3

从某种意义上说这是贪婪的,如果它们之间有一个 SNP 与两者重叠,它将把不重叠的 SNP 组合在一起。不确定在部分重叠 SNP 序列的情况下您想做什么。