在 R 中(尽管冗长):
这是一个测试数据框
df <- data.frame(
"CHR" = c(1,1,1,2,2),
"START" = c(100, 200, 300, 100, 400),
"STOP" = c(150,350,400,500,450)
)
首先我创建 GRanges 对象:
gr <- GenomicRanges::GRanges(
seqnames = df$CHR,
ranges = IRanges(start = df$START, end = df$STOP)
)
然后我减少折叠成新田庄对象的间隔:
reduced <- reduce(gr)
现在将一个新列附加到原始数据帧,以确认哪些行属于同一连续“ block ”。
subjectHits(findOverlaps(gr, reduced))
输出:
> df
CHR START STOP locus
1 1 100 150 1
2 1 200 350 2
3 1 300 400 2
4 2 100 500 3
5 2 400 450 3
如何在 Python 中执行此操作?我知道 pybedtools,但据我所知,这需要我将 data.frame 保存到磁盘。任何帮助表示赞赏。
最佳答案
https://github.com/biocore-ntnu/pyranges
import pyranges as pr
chromosomes = [1] * 3 + [2] * 2
starts = [100, 200, 300, 100, 400]
ends = [150, 350, 400, 500, 450]
gr = pr.PyRanges(chromosomes=chromosomes, starts=starts, ends=ends)
gr.cluster()
# +--------------+-----------+-----------+-----------+
# | Chromosome | Start | End | Cluster |
# | (int8) | (int32) | (int32) | (int64) |
# |--------------+-----------+-----------+-----------|
# | 1 | 100 | 150 | 1 |
# | 1 | 200 | 350 | 2 |
# | 1 | 300 | 400 | 2 |
# | 2 | 100 | 500 | 3 |
# | 2 | 400 | 450 | 3 |
# +--------------+-----------+-----------+-----------+
它将在 0.0.21 中发布。感谢您的想法!
关于pythonic相当于R GRanges中的reduce() - 如何折叠范围数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49118347/