我有两个大数据集,看起来像这样。
library(tidyverse)
dat1 <- tibble(chrom=c(rep(c("Chr1","Chr2"),each=5)),
start=c(9885,11944, 13271,15104,19059,25793,97514,104718,118862,120950),
end=c(11008,17644,20164,23807,25264,106001,119205, 121576,124981,138514)
)
head(dat1,n=4)
#> # A tibble: 10 × 3
#> chrom start end
#> <chr> <dbl> <dbl>
#> 1 Chr1 9885 11008
#> 2 Chr1 11944 17644
#> 3 Chr1 13271 20164
#> 4 Chr1 15104 23807
dat2 <- tibble(chrom=c(rep(c("Chr1","Chr2"),each=5)),
start=c(9885,11944, 13271,15104,19059,25793,97514,104718,118862,120950),
end=c(10203,12546,13669,15638,19283,26703,97773, 105102,119388,121331)
)
head(dat2, n=4)
#> # A tibble: 10 × 3
#> chrom start end
#> <chr> <dbl> <dbl>
#> 1 Chr1 9885 10203
#> 2 Chr1 11944 12546
#> 3 Chr1 13271 13669
#> 4 Chr1 15104 15638
使用 reprex v2.0.2 于2022-12-05创建
我想根据chrom对我的数据进行分组,并查找从dat2的Chr1的范围[start-end]与dat1的Chr1的范围[start-end]重叠的内容。
我尝试过的方法
我已经找到了一个很好的包来处理它,但我觉得我需要将数据集分成不同染色体的数据框来进行比较。
library(plyranges)
dat1 <- dat1 %>%
as_iranges()
dat2 <- dat2 %>%
as_iranges()
dat1 %>%
mutate(n_olap = count_overlaps(., dat2),
n_olap_within = count_overlaps_within(., dat2))
IRanges object with 10 ranges and 3 metadata columns:
start end width | chrom n_olap n_olap_within
<integer> <integer> <integer> | <character> <integer> <integer>
[1] 9885 11008 1124 | Chr1 1 0
[2] 11944 17644 5701 | Chr1 3 0
[3] 13271 20164 6894 | Chr1 3 0
[4] 15104 23807 8704 | Chr1 2 0
[5] 19059 25264 6206 | Chr1 1 0
[6] 25793 106001 80209 | Chr2 3 0
[7] 97514 119205 21692 | Chr2 3 0
[8] 104718 121576 16859 | Chr2 3 0
[9] 118862 124981 6120 | Chr2 2 0
[10] 120950 138514 17565 | Chr2 1 0
为了从这里获得我想要的内容,我需要过滤我的数据并进行比较。但是应该有一种方法或dplyr技巧来找到解决方案。
dat1 <- dat1 %>%
as_iranges() %>%
filter(chrom=="Chr1")
dat2 <- dat2 %>%
as_iranges() %>%
filter(chrom=="Chr1")
dat1 %>%
mutate(n_olap = count_overlaps(., dat2),
n_olap_within = count_overlaps_within(., dat2))
有没有一种方法只比较染色体?
i.end >= start&end> = i.start
这样行吗? - Ric