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

Al leer el foro, entiendo que necesito convertir DT en una matriz, pero no puedo hacerlo funcionar.
¡Gracias!
ScriptingRe: contando valores en cada filaPequeña pregunta, ¿la necesitas por columna o sobre todas?
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 filapara todos, pero es por fila
como que cada fila cuenta cuántas veces apareció un valor dentro de esa fila y luego, al final de esa fila, escribo el valor de "cuenta"
mira mi ejemplo a continuación, agregué una tablaRe: contando valores en cada filaDe otra manera.
Fórmula de columna para contar a lo largo de la fila
Esta fórmula utiliza subíndices de la tabla de datos para obtener una lista como {"prueba", "POR", "prueba", "prueba"} para la fila 8.
Arriba usé 1 :: 4, que se convierte en Index (1,4) como atajo. Debes usar {Column1, Column 2, ... Columna N} en cambio porque cuando cambié uno de los valores a "xyzzy", los valores de las columnas de fórmula no se actualizaron hasta que obligué a que las fórmulas se volvieran a ejecutar. Si JMP no puede decirle que una columna hace referencia a otra columna, no la reevaluará.
Esto funciona mejor:
fórmula con nombres de columna explícitos
Re: contando valores en cada filaMuy guay ... pero creo que te adentraste un poco en el gran abismoRe: 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 filaHola,
Otra forma más implica concatenar todas las columnas con una transformación de 1 clic.
Dado que "prueba" es 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 picadura de solo "POR".
Para concatenar, seleccione las columnas de interés y haga clic con el botón 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 lo tanto, usamos las fórmulas:
length (: concat) - 18 para el número de "test" == 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 en caracteres entre las 2 frases. Aquí, como k == 1, lo omitimos.

Salud,
Brady
Re: contando valores en cada filaMe gusta esto, Craige.
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: Contar valores en cada filaOye, esto no funciona
por ejemplo, si lo ejecuto en este
| 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
por lo que 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 |