Finden Sie den Modus in einer Spalte von MatrizenHallo!
Ich brauche Hilfe beim Schreiben eines Skripts, um den häufigsten Wert in mehreren Matrizen zu finden. Ich habe eine Datentabelle mit Hunderten von Zeilen. Jede Zeile hat eine Sequenzspalte (zB ABCDABCD) und ich habe eine Spalte erstellt, um die Positionen eines bestimmten Buchstabens innerhalb dieser Sequenz anzuzeigen (zB Die Position von A ist [1,5,0,0]).
(Ich bin ziemlich neu im Schreiben von Skripten, daher haben meine Matrizen im Moment 0 aufgelistet, wenn es keine Positionen mehr gibt, die diesen Buchstaben enthalten. Wenn es einen offensichtlichen, effizienteren Weg gibt, mehrere Positionen innerhalb einer Zeichenfolge zu finden, lassen Sie es mich bitte wissen. Gibt es ansonsten eine Möglichkeit, 0 als einen der Modi auszuschließen?)
Ich möchte mir nun alle in allen Reihen ausgerufenen Stellungen anschauen und die häufigsten Stellungen finden.
Was ich habe:
Zeile Matrix Spalte
1 [2, 3, 6, 8, 0, 0]
2 [2, 4, 5, 10, 0, 0]
3 [2, 7, 9, 10, 0, 0]
Was ich möchte:
Eine Liste, die die Modi in der Reihenfolge der meisten Vorkommnisse bis zur geringsten zeigt
Position 2 - 3 Vorkommen
Position 10 - 2 Vorkommen
Ich habe das Skript angehängt, das ich derzeit habe und das die Positionsfindungsformel enthält.
Danke schön!
SkripterstellungBetreff: Finden Sie den Modus in einer Spalte von MatrizenDanke schön!!Betreff: Finden Sie den Modus in einer Spalte von Matrizendt << select where(:(letter == "A" & :Row Num == 1) | (:Letter == "C" & :Row Num == 2);
Ist das nicht Ihre erste Anforderung?
Und Ihre zweite Anforderung sollte mit Tabulate berechnet werden können, wenn ich richtig verstehe, was Sie wollen
Betreff: Finden Sie den Modus in einer Spalte von MatrizenIch muss in der Lage sein, die Positionen verschiedener Buchstaben pro Zeile zu lokalisieren und dann die Zeilen zu vergleichen. Zum Beispiel muss ich die Positionen aller "A" in der Sequenz von Zeile 1 und alle Positionen von "C" in der Sequenz von Zeile 2 finden. Dann muss ich in der Lage sein, den am häufigsten vorkommenden Ort in der Tabelle zu sehen.
Mit dem Skript, das Sie mir gegeben haben (danke übrigens!), kann ich diesen tabellenweiten Vergleich immer noch nicht durchführen.
Betreff: Finden Sie den Modus in einer Spalte von MatrizenHier ist ein Skript, das eine andere Methode verwendet, um Sie an einen Punkt zu bringen, an dem Sie alle Buchstabenwerte in eine neue Spalte geparst haben, von der aus Sie Ihre Analysen durchführen können
dt=current data table();
// Create a new table with just the Sequence column in it
dtbuild = dt << subset(columns("Sequence"), selected rows(0));
// Find the longest sequence
Maxstring = col max(length(:sequence));
// Add a new column called Row Num that will let you keep track of what row
// each letter came from
dtBuild << New column("Row Num", formula(row()));
// Convert the data into real values
dtBuild:Row Num << delete property("formula");
// Create a new column for each possible position in the sequence number, and
// strip off the ith character and place it into the column
For(i=1,i<=Maxstring,i++,
dtBuild << new column("C" || char(i),character, formula(substr(:sequence,eval(i),1)));
column(dtBuild,i) << delete property("formula");
);
// Create a list of the columns in the dtBuild data table
TheColumns = dtBuild << get column names();
// We are only going to stack the columns created that have bits of the
// sequence in them, so get rid of the names of the first 2 column in the data table
TheColumns = remove(TheColumns,1,2);
// Stack all of the columns in to a data table that can be worked with
dtFinal = dtBuild << Stack(
columns( TheColumns),
Source Label Column( "Position" ),
Stacked Data Column( "Letter" ),
Name( "Non-stacked columns" )(Keep( :Row Num ))
);
// Get rid of the interium table
close(dtBuild, nosave);
// Delete rows that have no letter value
dtFinal << select where(:Letter == "");
dtFinal << delete rows;