Bonjour,
J'essaie de trouver une formule qui comptera le plus grand nombre de fois qu'une lettre est répétée consécutivement dans une séquence. J'ai joint un exemple où j'essaie d'écrire une formule pour la colonne poly Ts, et cela générera un nombre de Ts dans une séquence consécutive.

Merci,
Pratish
Dans l'esprit des "autres solutions", voici une autre force brute :
NamesDefaultToHere(1);
// Given a string and a single character, finds the longest sequence of that character
// and returns the length and starting position of that sequence. If the sequence
// occurs more than once, only the first is identified
findLongestRepeatedCharacter =
Function({str, char}, {Default Local},
n = Length(str);
count = 0;
currentCount = 1;
// Traverse the string except for the last character
for (i = 1, i <= n-1, i++,
thisChar = Substr(str, i, 1);
nextChar = Substr(str, i+1, 1);
// If the current character and the next are both 'char' ...
if((thisChar == char & nextChar == char),
// ... increment 'currentCount'
currentCount++,
// ... else if they're not ...
if(currentCount > count,
// ... record 'currentCount' if it's bigger than we've seen so far
count = currentCount;
);
// ... and reset 'currentCount'
currentCount = 1;
);
);
// Build the sequence we've found
seq = Repeat(char, count);
// Find where it occurs
pos = Munger(str, 1, seq);
// Return the results
if (pos == 0,
EvalList({0, pos}),
EvalList({count, pos})
);
);
// Try it out
str = "(N1:25252525)AACCAA(N1)GACGTTAACAGTTCTTTG";
Print(findLongestRepeatedCharacter(str, "T"));
Print(findLongestRepeatedCharacter(str, "A"));
Print(findLongestRepeatedCharacter(str, "X"));La formule de table utilisant ShortestEditScript() a utilisé s2 dans une partie de la formule qui aurait dû être Sequence. Le tableau avec la fonction corrigée est joint.
Voici une approche simple de la force brute ; pas sûr de la performance par rapport à @gzmorgan0 les méthodes de.
s2 = "(N1:25252525)AACCAA(N1)GACGTTAACAGTTCTTTG";
len = length(s2);
tstring = repeat("T", len);
maxlen = 0;
for (i = len, i >= 1, i--,
if (contains(s2, tstring),
maxlen = i;
break();
,
tstring = substr(tstring, 2);
);
);
show(maxlen);Un expert en expression régulière peut avoir un joli modèle pour analyser et trouver toutes les correspondances, mais cela dépasse mes compétences en REGEX.
J'ai fourni deux solutions qui peuvent être faites en utilisant des formules de colonne. Les deux pourraient avoir besoin d'explications.
La première utilise des fonctions de caractères imbriquées, la seconde utilise la fonction ShortestEditScript(). Soit dit en passant, vous n'avez pas précisé si vous comptez les séquences T avant (N1), les deux utilisent la chaîne entière. L'exemple de tableau est joint et les explications sont ci-dessous

Supposons que s2 = "(N1:25252525)AACCAA(N1)GACGTTAACAGTTCTTTG" ;
Fonctions de caractères : Words(), Sort List(), Reverse(), list[n], Length()
Length(Reverse(Sort List(words(s2,"ACGN():0123456789")))[1]);
Voici la sortie du journal pour les fonctions respectives
//:*/
words(s2,"ACGN():0123456789")
/*:
{"TT", "TT", "TTT"}
//:*/
Reverse(Sort List(words(s2,"ACGN():0123456789")))
/*:
{"TTT", "TT", "TT"}
//:*/
Reverse(Sort List(words(s2,"ACGN():0123456789")))[1]
/*:
"TTT"
//:*/
Length(Reverse(Sort List(words(s2,"ACGN():0123456789")))[1]);
/*:
3ShortestEditScript() est une fonction intéressante. Scénario 9_Extra_ShortestEditDistance.jsl écrit pour Compagnon JSL, Applications du langage de script JMP deuxième édition document 4 méthodes différentes pour utiliser cette fonction puissante et utile.Pour cet exemple, j'utilise Sequnces() et demande une sortie de matrice. Cela prendrait trop de place pour documenter cela complètement, dans ce forum, donc je vais juste montrer les résultats et ajouter quelques commentaires.
msed = Shortest Edit Script( Strings(s2, Repeat("T",length(s2)),matrix(1)) );
maximum(msed[loc(msed[0,1]==0),4]);Les deux chaînes comparées sont s2 et une chaîne de tous les T créée par la fonction Repeat("T", length(s2) ).
msed = Shortest Edit Script( Strings(s2, Repeat("T",length(s2)),matrix(1)) );
/*:
[-1 1 . 27,
0 28 1 2,
-1 30 . 5,
0 35 3 2,
-1 37 . 1,
0 38 5 3,
-1 41 . 1,
1 . 8 34]
/* The matrix output n x 4 where n = nrow(msed)
Column1: -1 | 1| 0 -1-->remove, 1-->insert, 0-->common
Column2: position in the 1st string .-->missing / not found
Column3: position in the 2nd string .-->missing / not found
Column4: length
*/Alors maintenant, il s'agit de trouver les emplacements dans la 1ère colonne de la matrice avec des 0 (correspond/commun/T), cela peut être fait avec la fonction loc(). Ensuite, la longueur de la séquence correspondante se trouve dans la 4e colonne, il suffit donc de trouver le maximum.Remarque msed[0,1] représente la 1ère colonne de la matrice msed.
loc(msed[0,1]==0)<BR />/*:<BR />[2, 4, 6] <BR />//:*/<BR />msed[loc(msed[0,1]==0),4]<BR />/*:<BR />[2, 2, 3]<BR />//:*/<BR /> maximum(msed[loc(msed[0,1]==0),4]);<BR />/*:<BR />3
Il sera intéressant de voir d'autres solutions.