我有一个数据集,缩写在这里:
SNP chr BP log10 PPA
rs10068 17 56555 1.16303 0.030
rs10032 17 56561 26.364 0.975
rs10354 17 34951 4.3212 0.626
rs10043 17 20491 0.00097 0.006
rs10457 17 69572 -0.38403 0.014
rs10465 17 69872 8.19547 0.927
其中PPA是后关联概率。由于我有一些较高的log10值(> 6),我想确定这些区域周围的可靠间隔,以确定它们确实有多大或多小。
为此,我首先想要识别具有log10>的SNP。 6,使用子集很简单。
newdata <- subset(data, log10 > 6)
然而,我还想在该子集中包括物理上靠近这些前导SNP的SNP,使用BP 500 +/-前导SNP的BP(log10> 6)。在这里,我不确定最好的方法。这是我可以在subset
中使用的东西,还是我应该首先在原始数据中识别这些先导SNP,然后从那里进行分组?
一旦我隔离了这些区域,我就能继续前进。
任何建议表示赞赏!
答案 0 :(得分:6)
s <- read.table(header=T, text="SNP chr BP log10 PPA
rs10068 17 56555 1.16303 0.030
rs10032 17 56561 26.364 0.975
rs10354 17 34951 4.3212 0.626
rs10043 17 20491 0.00097 0.006
rs10457 17 69572 -0.38403 0.014
rs10465 17 69872 8.19547 0.927")
距离s $ log10&gt;的任何行的距离6:
outer(s$BP[s$log10 > 6], s$BP, '-')
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 6 0 21610 36070 -13011 -13311
## [2,] 13317 13311 34921 49381 300 0
上面的任何列的绝对值< 500是你想要保留的:
s[apply(outer(s$BP[s$log10 > 6], s$BP, '-'), 2, function(x) any(abs(x) < 500)),]
## SNP chr BP log10 PPA
## 1 rs10068 17 56555 1.16303 0.030
## 2 rs10032 17 56561 26.36400 0.975
## 5 rs10457 17 69572 -0.38403 0.014
## 6 rs10465 17 69872 8.19547 0.927
答案 1 :(得分:1)
对于它的价值,这是使用GenomicRanges
包的解决方案。此包基于IRanges
构建,使用interval trees
非常有效地处理间隔数据。这应该能够处理所有不同的染色体。
首次加载数据:
# load data
df <- read.table(header=T, text="SNP chr BP log10 PPA
rs10068 17 56555 1.16303 0.030
rs10032 17 56561 26.364 0.975
rs10354 17 34951 4.3212 0.626
rs10043 17 20491 0.00097 0.006
rs10457 17 69572 -0.38403 0.014
rs10465 17 69872 8.19547 0.927")
获取log10&gt;的子集6
df.f <- df[df$log10 > 6, ]
在初始数据和子集
上加载和创建范围require(GenomicRanges)
df.gr <- GRanges(Rle(df$chr), IRanges(df$BP, df$BP))
df.f.gr <- GRanges(Rle(df.f$chr), IRanges(df.f$BP, df.f$BP))
使用log10&gt;查找数据的所有重叠项6与所有其他SNP的间隙= +/- 500
olaps <- findOverlaps(df.f.gr, df.gr, maxgap=500)
获取输出
# if you just want a whole data.frame with ALL SNPs that have
# log > 6 or within 500 bases of one with log > 6, then,
out <- df[subjectHits(olaps), ]
# SNP chr BP log10 PPA
# 1 rs10068 17 56555 1.16303 0.030
# 2 rs10032 17 56561 26.36400 0.975
# 5 rs10457 17 69572 -0.38403 0.014
# 6 rs10465 17 69872 8.19547 0.927
# In case you want for each SNP that has log > 6, all of the
# snps that are within 500 bases (either side) apart for
# this SNP, separately, then,
out.list <- split(out, df$BP[queryHits(olaps)])
# $`56555`
# SNP chr BP log10 PPA
# 1 rs10068 17 56555 1.16303 0.030
# 2 rs10032 17 56561 26.36400 0.975
#
# $`56561`
# SNP chr BP log10 PPA
# 5 rs10457 17 69572 -0.38403 0.014
# 6 rs10465 17 69872 8.19547 0.927