Trouver le mode dans une colonne de matricesBonjour!
J'ai besoin d'aide pour écrire un script pour trouver la valeur la plus courante dans plusieurs matrices. J'ai une table de données avec des centaines de lignes. Chaque ligne a une colonne de séquence (par exemple, ABCDABCD) et j'ai créé une colonne pour afficher les positions d'une certaine lettre dans cette séquence (par exemple, l'emplacement de A est [1,5,0,0]).
(Je suis assez nouveau dans l'écriture de scripts, donc pour le moment, mes matrices ont 0 répertorié lorsqu'il n'y a plus de positions contenant cette lettre. S'il existe un moyen évident et plus efficace de trouver plusieurs positions dans une chaîne, faites-le moi savoir. Sinon, existe-t-il un moyen d'exclure 0 comme l'un des modes ?)
Je voudrais maintenant examiner toutes les positions appelées dans toutes les rangées et trouver les positions les plus courantes.
Ce que j'ai:
ligne matrice colonne
1 [2, 3, 6, 8, 0, 0]
2 [2, 4, 5, 10, 0, 0]
3 [2, 7, 9, 10, 0, 0]
Ce que je veux:
Une liste montrant les modes dans l'ordre du plus au moins
position 2 - 3 occurrences
position 10 - 2 occurrences
J'ai joint le script que j'ai actuellement qui contient la formule de recherche de position,
Merci!
ScriptRe : Trouver le mode dans une colonne de matricesMerci!!Re : Trouver le mode dans une colonne de matricesdt << select where(:(letter == "A" & :Row Num == 1) | (:Letter == "C" & :Row Num == 2);
Cela ne vous donne-t-il pas votre première exigence?
Et votre deuxième exigence devrait pouvoir être calculée à l'aide de Tabuler, si je comprends bien ce que vous voulez
Re : Trouver le mode dans une colonne de matricesJe dois pouvoir localiser les positions des différentes lettres par rangée, puis comparer les rangées. Par exemple, je dois trouver les emplacements de tous les "A" dans la séquence de la ligne 1 et tous les emplacements de "C" dans la séquence de la ligne 2. Ensuite, je dois pouvoir voir l'emplacement le plus fréquent dans le tableau.
D'après le script que vous m'avez donné (merci au fait !), je suis toujours incapable de faire cette comparaison à l'échelle du tableau.
Re : Trouver le mode dans une colonne de matricesVoici un script qui utilise une méthode différente pour vous amener à un point où vous avez toutes les valeurs de lettre analysées dans une nouvelle colonne à partir de laquelle vous pouvez faire vos analyses
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;