Contando valores en cada filaTengo un script con las columnas 1-6 en una lista.
Estoy intentando escribir un script JSL que cuente cuántas veces aparece la palabra POR y cuántas veces aparece la palabra prueba.
ejemplo a continuación (lo hice manualmente en las últimas 2 columnas)

Al leer el foro, entiendo que necesito convertir DT en una matriz, pero no puedo hacerlo funcionar.
¡gracias!
Automatización y secuencias de comandosRe: Contando valores en cada filaLo sé... pero es un método sorprendentemente bueno desde el punto de vista del tiempo. Curiosamente, el método concat, por extraño que sea, también es muy rápido.
Por ejemplo, para una tabla de 200.000 filas x 10 columnas (archivo comprimido adjunto) de estos valores, estos son los tiempos de ejecución:

Names Default To Here( 1 );
dt = Current Data Table();
t1 = HP Time();
dt << new column("xx",
formula(sum( design (dt[row(), {:col1, :col2, :col3, :col4, :col5, :col6, :col7, :col8, :col9, :col10}], {"test"})))
);
t2 = hptime();
dt << New Column( "xx",
formula(
count = 0;
dt = :Col1 << get data table;
For( i = 1, i <= 10, i++,
If( Column( dt, i )[Row()] == "test", count ++)
);
count;
)
);
t3 = hptime();
dt << new column("xx", formula(nrow(loc(dt[row(), {:col1, :col2, :col3, :col4, :col5, :col6, :col7, :col8, :col9, :col10}], "test"))));
t4 = hptime();
dt << new column("concat", character, formula(Col1 || :Col2 || :Col3 || :Col4 || :Col5 || :Col6 || :Col7 || :Col8 || :Col9 ||:Col10));
dt << new column("xx", formula(length(:concat)-30));
t5 = hptime();
print(evalinsert("Design matrix method: ^(t2-t1)/1e6^ seconds."));
print(evalinsert("Looping method: ^(t3-t2)/1e6^ seconds."));
print(evalinsert("Nrow(Loc()) method: ^(t4-t3)/1e6^ seconds."));
print(evalinsert("Concat method: ^(t5-t4)/1e6^ seconds."));
Re: Contando valores en cada filaMuy bueno... pero creo que ya entraste un poco en el gran abismo.Re: Contando valores en cada filaMe gusta esto, Craig.
Parece que la función de matriz de diseño también puede manejar esta idea; pruebe esta fórmula para contar el número de "a".
dt = :Col1 << get data table;
Sum( Design( dt[Row(), {:Col1, :Col2, :Col3, :Col4, :Col5}], {"a"} ) );
Re: Contando valores en cada filaDe otra manera.
Column formula to count across rowColumn formula to count across rowFórmula de columna para contar en la fila
Esta fórmula utiliza subíndices en la tabla de datos para obtener una lista como {"test","POR","test","test"} para la fila 8.
Arriba usé 1::4, que se convierte en Index(1,4) como atajo. Deberías usar {Columna1, Columna 2, ... Columna N} en su lugar porque cuando cambié uno de los valores a "xyzzy", los valores de las columnas de la fórmula no se actualizaron hasta que forcé la repetición de las fórmulas. Si JMP no puede decir que una columna hace referencia a otra columna, no la reevaluará.
Esto funciona mejor:
formula with explicit column namesformula with explicit column namesfórmula con nombres de columnas explícitos
Re: Contando valores en cada filaHola,
Consulte la propiedad "Etiquetas de valor" de JMP, así como las utilidades de columnas "Etiquetas a códigos" y "Códigos a etiquetas".
Sería negligente si no recomendara el uso del número 1 para POR y 0 para prueba (1: prueba y 0: POR si lo prefiere). Usando la propiedad de la columna Etiqueta de valor, podemos hacer que estos valores APAREzcan como si fueran "prueba" y "POR", pero internamente son 0 y 1.
Dado que los valores son numéricos, los cálculos se pueden realizar utilizando fórmulas nativas de columnas y filas. En el caso de unos y ceros, la suma da el número de unos, mientras que la media da la proporción de unos. En este ejemplo, si almacenamos POR como 0 y "prueba" como 1, podemos encontrar el número de pruebas en una fila determinada simplemente seleccionando todas las columnas de interés, haciendo clic derecho y eligiendo Nueva columna de fórmula > Combinar > Suma en el menú emergente.
A continuación se muestra una imagen de cómo se ve esto en la práctica. Las celdas parecen contener texto, ya que las palabras POR y prueba están justificadas a la izquierda, pero cuando hace clic en una celda puede ver que, de hecho, JMP está almacenando un número internamente, similar a lo que se hace con las fechas y horas.

Al hacer clic en * a la derecha de los nombres de las columnas en el panel Columnas (centro izquierdo de la tabla de datos), podemos seleccionar "Etiquetas de valores" para ver la configuración actual de la propiedad:

Salud,
Brady
Re: Contando valores en cada filabuena idea
Re: Contando valores en cada filaHola,
Otra forma más consiste en concatenar todas las columnas con una transformación de 1 clic.
Dado que "prueba" tiene 1 carácter más que POR y no le faltan datos, la cadena resultante aumentará en 1 carácter por cada "prueba" contenida, en comparación con una serie de solo "POR".
Para concatenar, seleccione las columnas de interés y haga clic derecho, seleccionando como se muestra a continuación. Luego cambie el nombre de la columna "concat" por brevedad.

En la siguiente tabla de ejemplo, hay 6 columnas de interés; una cadena con sólo "POR" tendría, por tanto, 6 * 3 = 18 caracteres.
Por tanto, utilizamos las fórmulas:
length(:concat) - 18 para el número de "prueba" == n_test.
y
6 - n_test para el número de "POR".
En general, para n_test usaríamos (length(:concat) - 18)/k, donde k es la diferencia de caracteres entre las 2 frases. Aquí, como k == 1, lo omitimos.

Salud,
Brady
Re: Contando valores en cada filaCreé en JMP la tabla como me proporcionaste.

Luego creé una nueva columna y apliqué la siguiente fórmula a esa columna
count = 0;
For( i = 1, i <= 4, i++,
count = Sum( count, Contains( As Column( i ), "test" ) )
);
count;
Tenga en cuenta que el bucle For() solo llega hasta 4, porque solo hay 4 columnas en la tabla para procesar
Da los siguientes resultados

Adjunto la tabla de datos
Le recomiendo encarecidamente que se tome el tiempo de leer el documento Descubriendo JMP, disponible en el menú desplegable Ayuda.
Re: Contando valores en cada filapara todos, pero es por fila
como si cada fila contara cuántas veces aparecieron valores dentro de esa fila y luego, al final de esa fila, escribo el valor de "recuento"
Vea mi ejemplo a continuación. Agregué una tabla.Re: Contando valores en cada filaOye, esto no funciona
por ejemplo si lo ejecuto en esto
| POR | POR | POR | POR |
| POR | POR | POR | POR |
| prueba | POR | POR | prueba |
| prueba | POR | POR | prueba |
| POR | POR | POR | POR |
| POR | POR | POR | POR |
| prueba | POR | POR | prueba |
| prueba | POR | prueba | prueba |
los conteos salen como 0
lo que esperaría cuando ejecuto la "prueba" es: 0,2,2,0,0,2,3
entonces la salida es así:
| POR | POR | POR | POR | 0 |
| POR | POR | POR | POR | 0 |
| prueba | POR | POR | prueba | 2 |
| prueba | POR | POR | prueba | 2 |
| POR | POR | POR | POR | 0 |
| POR | POR | POR | POR | 0 |
| prueba | POR | POR | prueba | 2 |
| prueba | POR | prueba | prueba | 3 |
Re: Contando valores en cada filaAquí están las fórmulas que son una forma de calcular los recuentos.
count = 0;
For( i = 1, i <= 6, i++,
count = Sum( count, Contains( As Column( i ), "test" ) )
);
count;
count = 0;
For( i = 1, i <= 6, i++,
count = Sum( count, Contains( As Column( i ), "POR" ) )
);
count;
Re: Contando valores en cada filaPequeña pregunta, ¿lo necesitas por columna o sobre todas?