如何将计数从一组范围转移(总结)到那些范围内的范围?

问题描述 投票:3回答:3

我正在使用测序数据,但我认为该问题适用于不同的范围值数据类型。我想将来自具有起始和终止位置(范围)的集合DNA区域的读取计数(值)的几个实验组合成其他DNA区域的累加计数,其通常涉及许多主要区域。如下例所示:

给出下表A的范围和计数:

feature start end count1 count2 count3
gene1   1     10  100    30     22
gene2   15    40  20     10     6
gene3   50    70  40     11     7
gene4   100   150 23     15     9

和下表B(带有新范围):

feature  start  end
range1   1      45
range2   55     160

我想得到以下计数表与新范围:

feature  start  end  count1  count2  count3
range1   1      45   120     40      28
range2   55     160  63      26      16

只是为了简化,如果至少存在一些重叠(表A中的特征中至少有一小部分包含在表B中的特征中),则应该将其加起来。有没有可用的工具或perl,python或R中的脚本?我用bedtools multicov计算测序读数,但据我搜索,没有其他功能做我想要的。任何的想法?

谢谢。

pandas dataframe bioinformatics
3个回答
1
投票

我们可以这样做:

  1. 创建一个人工key
  2. 执行outer加入(mxn)
  3. 过滤startend值在我们的ranges之间
  4. pandas.DataFrame.groupbyfeaturesum count
  5. 最后concat输出到df2,以获得所需的输出
df1['key'] = 'A'
df2['key'] = 'A'

df3 = pd.merge(df1,df2, on='key', how='outer')

df4 = df3[(df3.start_x.between(df3.start_y, df3.end_y)) | (df3.end_x.between(df3.start_y, df3.end_y))]

df5 = df4.groupby('feature_y').agg({'count1':'sum',
                                    'count2':'sum',
                                    'count3':'sum'}).reset_index()

df_final = pd.concat([df2.drop(['key'], axis=1), df5.drop(['feature_y'], axis=1)], axis=1)

产量

print(df_final)
  feature  start  end  count1  count2  count3
0  range1      1   45     120      40      28
1  range2     55  160      63      26      16

1
投票

您可以将apply()pd.concat()与自定义函数一起使用,其中a对应于您的第一个数据帧,b对应于您的第二个数据帧:

def find_englobed(x):

    englobed = a[(a['start'].between(x['start'], x['end'])) | (a['end'].between(x['start'], x['end']))]

    return englobed[['count1','count2','count3']].sum()

pd.concat([b, b.apply(find_englobed, axis=1)], axis=1)

产量:

  feature  start  end  count1  count2  count3
0  range1      1   45     120      40      28
1  range2     55  160      63      26      16

0
投票

如果它可以帮助某人,基于@ rahlf23答案,我修改它使它更通用,考虑到一方面,计数列可以更多,除了范围,在右侧染色体上也很重要。

所以如果表“a”是:

feature Chromosome  start   end count1  count2  count3
gene1   Chr1        1       10  100     30      22
gene2   Chr1        15      40  20      10      6
gene3   Chr1        50      70  40      11      7
gene4   Chr1        100     150 23      15      9
gene5   Chr2        5       30  24      17      2
gene5   Chr2        40      80  4       28     16

表“b”是:

feature Chromosome  start   end
range1  Chr1        1       45
range2  Chr1        55      160
range3  Chr2        10      90
range4  Chr2        100     200

使用以下python脚本:

import pandas as pd

def find_englobed(x):
    englobed = a[(a['Chromosome'] == x['Chromosome']) & (a['start'].between(x['start'], x['end']) | (a['end'].between(x['start'], x['end'])))]
    return englobed[list(a.columns[4:])].sum()

pd.concat([b, b.apply(find_englobed, axis=1)], axis=1)

现在使用a['Chromosome'] == x['Chromosome'] &我要求它们在同一个染色体中,并且使用list(a.columns[4:])我从第5列到结尾都获得所有列,独立于计数列的数量。

我得到以下结果:

feature Chromosome  start   end count1  count2  count3
range1  Chr1        1       45  120.0   40.0    28.0
range2  Chr1        55      160 63.0    26.0    16.0
range3  Chr2        10      90  28.0    45.0    18.0
range4  Chr2        100     200 0.0     0.0     0.0

我不确定为什么获得的计数是浮点数..任何评论?

© www.soinside.com 2019 - 2024. All rights reserved.