python - 字典和函数基因映射输出未返回预期频率

标签 python bioinformatics genetics

几个小时以来我一直试图找出这个生物信息学代码有什么问题,但我看不到它。我的函数的各个部分似乎有效,但它没有看到某些模式。我使用滑动窗口函数来返回长度 k 的特定碱基对组合在一段文本中出现的次数。

我需要的第一个函数本质上创建核苷酸字符串四进制数的索引:

nucs = {'A':0,'C':1,'G':2,'T':3}
def PatternToNumber(Pattern):
    index = 0
    power = []
    for i in range(len(Pattern)-1,-1,-1):
        power.append(i)
    for i in range(len(Pattern)):
        index += nucs[Pattern[i]]*(4**power[i])
    return index

我使用的下一个函数会迭代一段文本,并将 1 添加到频率数组中的索引。

def ComputingFrequencies(Text,k):
    FrequencyArray = [0]*(4**k)
    for i in range(len(Text)-k):
        Pattern = Text[i:i+k]
        index = PatternToNumber(Pattern)
        FrequencyArray[index] += 1
    print(*FrequencyArray)

就像我说的,我已经研究了每一行,它似乎可以很好地按照我期望的方式将核苷酸模式放入索引号中,但是您运行的输出:

ComputeFrequencies('ACGCGGCTCTGAAA',2)

是:

1 1 0 0 0 0 2 2 1 2 1 0 0 1 1 0

如果您查看 FrequencyArray 中的第一个数字,它会告诉我们字符串“AA”仅显示 1,但文本输入中的最后三个字符是“AAA”,这将意味着“AA”出现了两次,FrequencyArray 中的第一个条目应该是 2 而不是 1。我们应该期望的是:

2 1 0 0 0 0 2 2 1 2 1 0 0 1 1 0

如果我没有很好地解释它,如果需要,我可以尝试澄清一下我的代码。

最佳答案

我很确定您只是遇到了 1 误差。因为您只是没有检查到最后一个字符?

for i in range(len(Text)-k):

对于长度 2,它只会迭代到第一个 AA,因此您只会看到它一次。更改为

for i in range(len(Text)-(k-1)):

我认为这应该会给你你想要的。

关于python - 字典和函数基因映射输出未返回预期频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60011230/

相关文章:

perl - 如何使用 Perl 搜索字符串中生物信息学基序的不同变体?

使用命名列表重命名列表列表

linux - 是否可以部分解压缩 .vcf 文件?

r - 在随机实验中用均值绘制基因表达数据

enums - 在 Go 中表示枚举的惯用方式是什么?

python - 使用干净的更改 Django 表单集中的字段

python - 绘制 sklearn RandomForestRegressor MSE 的图

python - 关于 .split() 的快速思考

python - Kivy 标签文本在滚动小部件中换行

python - 使用旁遮普语到底有什么好处