我正在使用测序数据,但我认为该问题适用于不同的范围值数据类型。我想将来自具有起始和终止位置(范围)的集合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计算测序读数,但据我搜索,没有其他功能做我想要的。任何的想法?
谢谢。
我们可以这样做:
key
列outer
加入(mxn)
start
或end
值在我们的ranges
之间pandas.DataFrame.groupby
在feature
和sum
count
列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
您可以将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
如果它可以帮助某人,基于@ 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
我不确定为什么获得的计数是浮点数..任何评论?