我使用R.看起来像这样的数据
> hits
Views on a 51-letter DNAString subject
subject: TCAGAAACAAAACCCAAAATCAGTAAGGAGGAGAAAGAAACCTAGGGAGAA
views:
start end width
[1] 1 10 10 [TCAGAAACAA]
[2] 14 23 10 [CCAAAATCAG]
[3] 19 28 10 [ATCAGTAAGG]
[4] 20 29 10 [TCAGTAAGGA]
[5] 21 30 10 [CAGTAAGGAG]
所以我有一个51长度的字符串叫
subject = TCAGAAACAAAACCCAAAATCAGTAAGGAGGAGAAAGAAACCTAGGGAGAA
。
从此subject
中提取5个子字符串。你可以在上面看到它们。我想看看5个子字符串是否在我感兴趣的区域中。感兴趣的区域来自位置14 - 27
。
subject = TCAGAAACAAAAC |-> CCAAAATCAGTAAG <-| GAGGAGAAAGAAACCTAGGGAGAA
。
换句话说,我有subject
字符串中的5个子字符串。在这5个字符串中,我只查找位于14 - 27
字符串的subject
位置之间的字符串。这是我感兴趣的区域。
第一个[1]
子串[TCAGAAACAA]
并不重要,因为它嵌入在开头(由坐标1 - 10
给出)并且在我感兴趣的区域之外。
坐标[2]
给出的第二个14 - 23
字符串告诉我它完全嵌入我感兴趣的区域(同样是14 - 27
)。
第三个[3]
字符串由坐标19 - 28
给出。这对我来说非常重要,因为大多数字符串都嵌入在我感兴趣的区域中。
第四个[4]
字符串由坐标20 - 29
给出。这对我来说很重要,因为除了最后一个字符之外,大部分字符串都嵌入在我感兴趣的区域中。
第五个子串的故事是相同的。
基本上,如果60%的字符串嵌入我感兴趣的区域,我想计算它。
有人可以给我一个伪代码算法吗?我一直在考虑绘制图表,但我似乎无法实现它。我在R中这样做,所以我将伪代码转换为R.此外,60%的数字是arbritrary。我必须与我的主管确认这一点,但我确信这是无关紧要的。
答案 0 :(得分:0)
def substring_index(longstring, substring):
"""Return the index of the substring in longstring."""
# Python has a built in function for this.
def is_interesting(index, length, interesting_start, interesting_end, percentage):
"""Return true if the substring is interesting."""
interesting = 0
uninteresting = 0
# check if the character at each position from index to index + length
# is in the interesting range.
for x in range(index, index + length + 1):
if interesting_start < x < interesting_end:
interesting += 1
else:
uninteresting += 1
# Do some math to see if interesting / (interesting + uninteresting)
# is bigger than percentage
使用substring_index
函数查看索引是否以及位于longstring中的位置。
使用is_interesting
函数根据子字符串是否有趣返回布尔值。
因此,对于第一个子字符串,您可以将其称为:
longstring = "TCAGAAACAAAACCCAAAATCAGTAAGGAGGAGAAAGAAACCTAGGGAGAA"
substring = "TCAGAAACAA"
is_interesting(substring_index(longstring, substring), len(substring), 14, 27, 0.6)
答案 1 :(得分:0)
如果我理解得很好,你需要
所以这就是我在javascript中所做的事情
var fractionIsInString = function (areaOfInterest, stringToBeFound, acceptedFraction) {
var fractionLength = Math.floor(stringToBeFound.length*acceptedFraction),
startPosition = 0,
endPosition = fractionLength,
fraction,
keepSearching = true;
do {
fraction = stringToBeFound.substring(startPosition, endPosition);
if (areaOfInterest.indexOf(fraction) > -1) {
return true;
}
startPosition++;
endPosition++;
keepSearching = endPosition < stringToBeFound.length;
} while (keepSearching);
return false;
};
要打电话给你,你只需说
fractionIsInString('CCAAAATCAGTAAG', 'TCAGAAACAA', 0.6);
第一个参数是您感兴趣的区域,可以像这样获得
subject.substring(14, 27);
第二个参数是从主题中获得的第一个字符串。从0到10的那个。 第三个参数是您要查找的第二个参数的一部分。在这种情况下为60%。
函数的工作原理是它在较大的字符串中查找字符串的分数,如果找不到分数,它会移动到字符串的下一部分,依此类推,直到找到找到的分数或者它到达字符串的末尾。