Hallo,
Ich versuche eine Formel zu finden, die die höchste Anzahl an Wiederholungen eines Buchstabens in einer Reihenfolge zählt. Ich habe ein Beispiel angehängt, in dem ich versuche, eine Formel für eine Poly-Ts-Spalte zu schreiben, die nacheinander die Anzahl der Ts in einer Sequenz generiert.

Danke schön,
Pratisch
Im Sinne von „anderen Lösungen“ ist hier eine weitere Brute-Force-Lösung:
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"));Die Tabellenformel mit ShortestEditScript() verwendete s2 in einem Teil der Formel, der Sequenz hätte sein sollen. Tabelle mit korrigierter Funktion ist beigefügt.
Hier ist ein einfacher Brute-Force-Ansatz. Ich bin mir nicht sicher, wie hoch die Leistung ist @gzmorgan0 's Methoden.
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);Ein Experte für reguläre Ausdrücke hat vielleicht ein gutes Muster zum Scannen und Finden aller Übereinstimmungen, aber das übersteigt meine REGEX-Kenntnisse.
Ich habe zwei Lösungen bereitgestellt, die mithilfe von Spaltenformeln durchgeführt werden können. Beides könnte einer Erklärung bedürfen.
Die erste verwendet verschachtelte Zeichenfunktionen, die zweite die Funktion ShortestEditScript(). Sie haben übrigens nicht angegeben, ob Sie T-Sequenzen vor (N1) zählen, beide verwenden die gesamte Zeichenfolge. Die Beispieltabelle ist beigefügt und Erläuterungen finden Sie weiter unten

Angenommen, s2 = "(N1:25252525)AACCAA(N1)GACGTTAACAGTTCTTTG";
Zeichenfunktionen: Words(), Sort List(), Reverse(), list[n], Length()
Length(Reverse(Sort List(words(s2,"ACGN():0123456789")))[1]);
Hier ist die Protokollausgabe für die jeweiligen Funktionen
//:*/
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() ist eine interessante Funktion. Skript 9_Extra_ShortestEditDistance.jsl geschrieben für JSL Companion, Anwendungen der JMP-Skriptsprache, zweite Ausgabe Dokumentieren Sie 4 verschiedene Methoden zur Verwendung dieser leistungsstarken und nützlichen Funktion.Für dieses Beispiel verwende ich Sequnces() und fordere eine Matrixausgabe an. Es würde zu viel Platz in Anspruch nehmen, dies in diesem Forum vollständig zu dokumentieren, daher werde ich nur die Ergebnisse zeigen und ein paar Kommentare hinzufügen.
msed = Shortest Edit Script( Strings(s2, Repeat("T",length(s2)),matrix(1)) );
maximum(msed[loc(msed[0,1]==0),4]);Die beiden verglichenen Zeichenfolgen sind s2 und eine Zeichenfolge aller Ts, die durch die Funktion Repeat("T", length(s2) ) erstellt wurde.
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
*/Jetzt geht es also darum, die Positionen in der 1. Spalte der Matrix mit Nullen (Übereinstimmungen/Common/Ts) zu finden. Dies kann mit der Funktion loc() erfolgen. Dann steht die Länge der passenden Sequenz in der 4. Spalte, also finden Sie einfach das Maximum.Beachten Sie, dass msed[0,1] die erste Spalte der Matrix msed darstellt.
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
Es wird interessant sein, andere Lösungen zu sehen.