如何删除介于其他两个列值之间的行?
How can I delete rows that fall between two other column values?
我有一个data.frame1:
BIN CHR BP1 BP2 Score Value
12 chr1 29123222 29454711 -5.7648 599
116 chr13 45799118 45986770 -4.8403 473
117 chr5 46327104 46490961 -5.3036 536
121 chr6 50780759 51008404 -4.4165 415
133 chr18 63634657 63864734 -4.8096 469
147 chr1 77825305 78062178 -5.4671 559
我有第二个 data.frame2 像:
CHR SNP A1 A2 BP INFO OR SE P NGT
chr1 rs10900604 A G 29204555 0.774 1.01582 0.0143 0.2723 0
chr3 rs12132517 A G 79880711 0.604 0.98334 0.0253 0.5071 2
chr14 rs11240777 A G 79895429 0.818 0.98817 0.0139 0.3907 27
chr18 rs147634896 T C 63789900 0.623 1.02634 0.0259 0.3161 0
chr6 rs143609865 A T 77934001 0.617 1.01562 0.0317 0.6254 0
我有兴趣保留 data.frame2 中符合以下条件的所有行:它们在 data.frame1 中的任何行的 BP1 和 BP2 之间具有相同的 CHR 和 BP 值。
例如,data.frame2 的第一行有 "chr1",并且在 data.frame1 的一个 BP 范围之间也有一个 "BP"。请注意,它不属于第 7 行的范围,但确实属于第 1 行的范围。因此,我想将这一行保留在 data.frame2
另一个例子,data.frame2的第4行有"chr18"和BP 63789900落在data.frame1第5行的BP范围内(BP1和BP2之间)。因此,我想将这一行保留在 data.frame2
最后一个例子。请注意,data.frame2 中的第 5 行的 BP 77934001 落在 data.frame1 中第 6 行的 BP1 和 BP2 范围内。然而在 data.frame2 中 "chr6" 与 "chr1" 不匹配。我想删除这一行。
我还想删除不同时匹配 CHR 和 BP 范围的所有其他行。
我在想如果循环有 CHR1=CHR2,并且 BP>BP1 和 BP
这应该可以使用 base R:
# merge the relevant data
dfmerge = merge(df1[c("CHR", "BP1", "BP2")], df2, by = "CHR")
# delete unwanted rows
dfmerge = dfmerge[(dfmerge$BP > dfmerge$BP1 & dfmerge$BP < dfmerge$BP2),]
# clean up columns
dfmerge[c("BP1", "BP2")] = list(NULL)
一般来说,SQL可以做到简洁明了:
library(sqldf)
sqldf("select df2.*
from df2 inner join df1
on df2.CHR = df1.CHR
and df2.BP between df1.BP1 and df2.BP2")
这是一个dplyr
方法:
d %>%
left_join(d2) %>%
filter(BP >= BP1 & BP <= BP2)
我有一个data.frame1:
BIN CHR BP1 BP2 Score Value
12 chr1 29123222 29454711 -5.7648 599
116 chr13 45799118 45986770 -4.8403 473
117 chr5 46327104 46490961 -5.3036 536
121 chr6 50780759 51008404 -4.4165 415
133 chr18 63634657 63864734 -4.8096 469
147 chr1 77825305 78062178 -5.4671 559
我有第二个 data.frame2 像:
CHR SNP A1 A2 BP INFO OR SE P NGT
chr1 rs10900604 A G 29204555 0.774 1.01582 0.0143 0.2723 0
chr3 rs12132517 A G 79880711 0.604 0.98334 0.0253 0.5071 2
chr14 rs11240777 A G 79895429 0.818 0.98817 0.0139 0.3907 27
chr18 rs147634896 T C 63789900 0.623 1.02634 0.0259 0.3161 0
chr6 rs143609865 A T 77934001 0.617 1.01562 0.0317 0.6254 0
我有兴趣保留 data.frame2 中符合以下条件的所有行:它们在 data.frame1 中的任何行的 BP1 和 BP2 之间具有相同的 CHR 和 BP 值。
例如,data.frame2 的第一行有 "chr1",并且在 data.frame1 的一个 BP 范围之间也有一个 "BP"。请注意,它不属于第 7 行的范围,但确实属于第 1 行的范围。因此,我想将这一行保留在 data.frame2
另一个例子,data.frame2的第4行有"chr18"和BP 63789900落在data.frame1第5行的BP范围内(BP1和BP2之间)。因此,我想将这一行保留在 data.frame2
最后一个例子。请注意,data.frame2 中的第 5 行的 BP 77934001 落在 data.frame1 中第 6 行的 BP1 和 BP2 范围内。然而在 data.frame2 中 "chr6" 与 "chr1" 不匹配。我想删除这一行。
我还想删除不同时匹配 CHR 和 BP 范围的所有其他行。
我在想如果循环有 CHR1=CHR2,并且 BP>BP1 和 BP
这应该可以使用 base R:
# merge the relevant data
dfmerge = merge(df1[c("CHR", "BP1", "BP2")], df2, by = "CHR")
# delete unwanted rows
dfmerge = dfmerge[(dfmerge$BP > dfmerge$BP1 & dfmerge$BP < dfmerge$BP2),]
# clean up columns
dfmerge[c("BP1", "BP2")] = list(NULL)
一般来说,SQL可以做到简洁明了:
library(sqldf)
sqldf("select df2.*
from df2 inner join df1
on df2.CHR = df1.CHR
and df2.BP between df1.BP1 and df2.BP2")
这是一个dplyr
方法:
d %>%
left_join(d2) %>%
filter(BP >= BP1 & BP <= BP2)