检查位置相交并根据 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 序列的情况下您想做什么。
我正在研究 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 序列的情况下您想做什么。