Encuentra el modo en una columna de matrices¡Hola!
Necesito ayuda para escribir un script para encontrar el valor más común en varias matrices. Tengo una tabla de datos con cientos de filas. Cada fila tiene una columna de secuencia (por ejemplo, ABCDABCD) y he creado una columna para mostrar las posiciones de una determinada letra dentro de esa secuencia (por ejemplo, la ubicación de A es [1,5,0,0]).
(Soy bastante nuevo en escribir guiones, así que ahora mis matrices tienen 0 en la lista cuando no hay más posiciones que contengan esa letra. Si hay una manera obvia y más eficiente de encontrar múltiples posiciones dentro de una cadena, hágamelo saber. De lo contrario, ¿hay una manera de excluir 0 como uno de los modos?)
Ahora me gustaría ver todas las posiciones indicadas en todas las filas y encontrar las posiciones más comunes.
Lo que tengo:
columna matriz de filas
1 [2, 3, 6, 8, 0, 0]
2 [2, 4, 5, 10, 0, 0]
3 [2, 7, 9, 10, 0, 0]
Lo que quiero:
Una lista que muestra los modos en orden de la mayoría de los casos al menos
posición 2 - 3 apariciones
posición 10 - 2 apariciones
Adjunto el script que tengo actualmente que contiene la fórmula de búsqueda de posición,
¡Gracias!
Re: Encuentra el modo en una columna de matrices¡¡Gracias!!Re: Encuentra el modo en una columna de matricesdt << seleccione dónde (:( letra == "A" &: Número de fila == 1) | (: Letra == "C" &: Número de fila == 2);
¿Eso no te da tu primer requisito?
Y su segundo requisito debe poder calcularse utilizando Tabulate, si estoy entendiendo correctamente lo que quiere
Re: Encuentra el modo en una columna de matricesNecesito poder ubicar las posiciones de diferentes letras por fila y luego comparar las filas. Por ejemplo, necesito encontrar las ubicaciones de todas las letras "A" en la secuencia de la fila 1 y todas las ubicaciones de "C" en la secuencia de la fila 2. Entonces necesito poder ver la ubicación más frecuente en la tabla.
Del guión que me ha dado (¡gracias por cierto!) Todavía no puedo hacer esta comparación de la tabla.
Re: Encuentra el modo en una columna de matricesAquí hay un script que utiliza un método diferente para llegar a un punto en el que tiene todos los valores de las letras analizadas en una nueva columna desde la que puede hacer su análisis.
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;