pythonic等价于R GRanges中的reduce()如何折叠范围内的数据?

2024-09-25 02:25:49 发布

您现在位置:Python中文网/ 问答频道 /正文

在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)
  )

然后我缩小间隔以折叠成新的granges对象:

reduced <- reduce(gr)

现在将一个新列附加到原始数据帧,以确认哪些行属于同一个连续的“chunk”。你知道吗

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,但据我所知,这需要我保存我的数据框到磁盘。谢谢你的帮助。你知道吗


Tags: 对象dfdataframestartstopranges测试数据
2条回答

看来你正试图找到它们的交叉点。Pybedtools将接受流作为输入。将数据读入bed格式的字符串。你知道吗

“chr,开始,停止”

我从一个python字典开始,循环浏览它。你知道吗

bed_string += "{0} {1} {2} {3} {0}|{1}|{2}|{3}\n".format(chrom, coord_start, coord_stop, aberration)
# Now create your bedtools.
breakpoint_bedtool = pybedtools.BedTool(bed_string, from_string=True)
target_bedtool = pybedtools.BedTool(self.args.Target_Bed_File, from_string=False)
# Find target intersects for printing.
breakpoint_target_intersect = breakpoint_bedtool.intersect(target_bedtool, wb=True, stream=True)

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后退出。谢谢你的主意!你知道吗

相关问题 更多 >