I have the following code:
import numpy as np
def mean_if_no_missings(x, no_missings=3):
if np.isnan(x).sum() < no_missings:
return np.mean(x)
else:
return np.NaN
df['SCORE']=df.ix['Q1':'Q10'].apply(conditional_mean, axis=1)
The string then becomes "ATATCGATCG". So far so goood. Each letter pair should be an array, and each array is an array item. The expected result is:
function pair(str) {
// This function checks whether there
// a certain letter in a string and checks
// if it is followed or follows a specific
// letter.
for (var i = 0; i < str.length; i++) {
// If the letter isn't the letter "C"
// before the "G", then it'll placed before it.
if (str[i] == 'G' && str[i - 1] != 'C') {
str = str.slice(0, i) + 'C' + str.slice(i);
// The same goes for "A" and "T".
} else if (str[i] == 'T' && str[i - 1] != 'A') {
str = str.slice(0, i) + 'A' + str.slice(i);
// And so on.
} else if (str[i] == 'C' && str[i + 1] != 'G') {
str = str.slice(0, i + 1) + 'G' + str.slice(i + 1);
} else if (str[i] == 'A' && str[i + 1] != 'T') {
str = str.slice(0, i + 1) + 'T' + str.slice(i + 1);
}
}
str = str.split('');
var temp = [];
for (var j = 0; j <= str.length / 2; j++) {
temp.push([]);
for (var k = 0; k < 2; k++) {
temp[j].push(str.shift());
}
}
return temp;
}
pair("TTGAG");
But instead I get this result:
// > [ ['A', 'T'], ['A', 'T'], ['C', 'G'], ['A', 'T'], ['C', 'G'] ]
What is the mistake in the code? I tried several times to find the error but I haven't succeeded.
答案 0 :(得分:0)
我想我发现了这个问题。简短的回答是需要在循环之前设置外部for循环的限制。
var limit = str.length / 2 -1;
for (var j = 0; j <= limit; j++) {
...
或
var limit = str.length / 2;
for (var j = 0; j < limit; j ++) {
...
原因是内循环中的每个移位操作都将str数组的大小减小了一个。 j <= str.length /2
表达式在每个循环开始时进行评估 - 在前一个内循环上进行两次移位操作之后。
最初str.length / 2 == 5;
temp == [['A', 'T']]
然后经过两次轮班操作str.length / 2 == 4;
temp == [['A', 'T']['A','T']]
再进行两次轮班操作str.length /2 == 3;
temp == [['A','T']['A','T']['C','G']]
外部for循环条件的最后时间被评估为str.length / 2 == 2,此时j == 2所以循环结束。
for循环的MDN参考很有用:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for
答案 1 :(得分:0)
如果我正确理解您的问题,您尝试使用"TTGAG"
之类的输入字符串,并将其转换为[A,T]
或[C,G]
的数组。
这是我要采取的方法。
// renamed pair function for clarity
// assume genes == 'TTGAG'
function GeneStringToArray(genes){
var geneSplit = genes.split(''); // [T,T,G,A,G]
for(var i = 0; i < geneSplit.length; i += 1){
geneSplit[i] = getGenePair(geneSplit[i]);
}
return geneSplit; // out: [['A','T'],['A','T'],['C','G'],['A','T'],['C','G']]
}
function getGenePair(gene) {
// force lower case for ease of comparison
char = char.toLowerCase();
// Define our results
var at = ['A', 'T'];
var cg = ['C','G'];
if(gene === 'a' || gene === 't'){
return at;
}
if(gene === 'c' || gene === 'g'){
return cg;
}
}
我非常有信心以干净,可读的方式解决您的问题。