我正在尝试根据修剪的质量得分修剪序列。因为我对python比较陌生,所以我一直在寻找可以解决问题的简单方法。
我有以下质量得分,根据phred得分转换为数值:
1816 28 32 32 26 164 30 32 1816 1618 216 22 1616 216 218 20 28 1816 1816 24 1816 1620 20 24 28 28 28 216 26 28 1622 216 28 24 18 24 28 1622 30 222 24 18 218 216 26 26 218 28 1624 24 16 26 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
以下是相应的序列:
ACCGAGCCGAAGGAGACCGCATTCACCCGGATGCCCTTCGAGGCCAGCGCCACCGCCATCGACCGCGTCATCTGCTCCACCGCGGCCCAGCTGATGGAACA
基本上,我希望能够在质量得分的末尾删除/剪切/修剪所有值“2”,比较两个字符串并删除/剪切/修剪序列末尾的相应序列核苷酸。
我尝试将质量得分分成两部分,然后用它来打印序列的第一部分:
int number = Integer.parseInt(Arrays.stream(arr).mapToObj(String::valueOf).collect(Collectors.joining()));
但它似乎没有打印切割序列。我能够在我想要的地方削减质量得分。您可能注意到的另一件事是质量得分值没有适当间隔。我不确定为什么会发生这种情况。转换后我使用cutquality = actualquality.split(" 2 ",1)
newquality = cutquality[0]
lenofseq = len(cutquality[0].strip(" "))
newseq = actualseq[:lenofseq]
作为质量得分值,这是我得到的输出。
我很感激你的建议!
答案 0 :(得分:1)
dropwhile()
,当应用于反转数据时,会执行您想要的操作 - 它会过滤,直到过滤器不再为真,然后完全退出,低质量分数将不再跳过它:
from itertools import dropwhile
qualities = '1816 28 32 32 26 164 30 32 1816 1618 216 22 1616 216 218 20 28 1816 1816 24 1816 1620 20 24 28 28 28 216 26 28 1622 216 28 24 18 24 28 1622 30 222 24 18 218 216 26 26 218 28 1624 24 16 26 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2'.split()
sequence = 'ACCGAGCCGAAGGAGACCGCATTCACCCGGATGCCCTTCGAGGCCAGCGCCACCGCCATCGACCGCGTCATCTGCTCCACCGCGGCCCAGCTGATGGAACA'
QUALITY_LIMIT = 2
QUALITY_SCORE, BASE = 0, 1
filter = lambda pair: pair[QUALITY_SCORE] <= QUALITY_LIMIT
reversed_quality_sequence = zip(reversed([int(quality) for quality in qualities]), reversed(sequence))
filtered_sequence = "".join(reversed([pair[BASE] for pair in dropwhile(filter, reversed_quality_sequence)]))
print(filtered_sequence)
<强>输出强>
ACCGAGCCGAAGGAGACCGCATTCACCCGGATGCCCTTCGAGGCCAGCGCCA
也可以使用相同的技术(更容易)在序列开始时清理低质量数据。
答案 1 :(得分:0)
要仅从质量得分的结尾处理修剪,您可以在反向quality_scores
列表中使用itertools.dropwhile()
来摆脱尾随的&#39; 2&#39;项目(感谢@cdlane的想法)。然后将bases
切片到修剪质量分数的长度。不需要压缩:
from itertools import dropwhile
quality_scores = '1816 28 32 32 26 164 30 32 1816 1618 216 22 1616 216 218 20 28 1816 1816 24 1816 1620 20 24 28 28 28 216 26 28 1622 216 28 24 18 24 28 1622 30 222 24 18 218 216 26 26 218 28 1624 24 16 26 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2'.split()
bases = 'ACCGAGCCGAAGGAGACCGCATTCACCCGGATGCCCTTCGAGGCCAGCGCCACCGCCATCGACCGCGTCATCTGCTCCACCGCGGCCCAGCTGATGGAACA'
length = len(list(dropwhile(lambda x: x == '2', reversed(quality_scores))))
newseq = bases[:length]
print(newseq)
<强>输出强>
ACCGAGCCGAAGGAGACCGCATTCACCCGGATGCCCTTCGAGGCCAGCGCCA