Conteggio dei valori in ogni rigaHo uno script con col 1-6 in un elenco
Sto cercando di scrivere uno script JSL che conteggi quante volte appare la parola POR e quante volte appare la parola test
esempio qui sotto (ha fatto manualmente le ultime 2 colonne)

leggendo il forum capisco che devo convertire DT in una matrice, ma non riesco a farlo funzionare.
Grazie!
Automazione e scriptingRi: Conteggio dei valori in ogni rigaLo so... ma è un metodo sorprendentemente buono dal punto di vista temporale. È interessante notare che anche il metodo concat, per quanto strano, è molto veloce.
Ad esempio, per una tabella di 200.000 righe x 10 colonne (file compresso allegato) di questi valori, ecco i tempi di esecuzione:

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."));
Ri: Conteggio dei valori in ogni rigaMolto bello... ma penso che tu sia entrato un po' nel grande abissoRi: Conteggio dei valori in ogni rigaMi piace, Craige.
Sembra che anche la funzionalità della matrice di progettazione possa gestire questa idea: prova questa formula per contare il numero di "a".
dt = :Col1 << get data table;
Sum( Design( dt[Row(), {:Col1, :Col2, :Col3, :Col4, :Col5}], {"a"} ) );
Ri: Conteggio dei valori in ogni rigaUn altro modo.
Column formula to count across rowColumn formula to count across rowFormula di colonna per contare su tutta la riga
Questa formula utilizza l'abbonamento alla tabella dati per ottenere un elenco come {"test","POR","test","test"} per la riga 8.
Sopra ho usato 1::4, che si trasforma in Index(1,4) come scorciatoia. Dovresti usare {Colonna1, Colonna 2, ... Colonna N} invece perché quando ho modificato uno dei valori in "xyzzy" i valori delle colonne formula non si sono aggiornati finché non ho forzato la riesecuzione delle formule. Se JMP non riesce a stabilire che una colonna fa riferimento a un'altra colonna, non verrà rivalutata.
Funziona meglio:
formula with explicit column namesformula with explicit column namesformula con nomi di colonna espliciti
Ri: Conteggio dei valori in ogni rigaCIAO,
Consulta la proprietà "Etichette valori" di JMP, nonché le utilità delle colonne "Etichette per codici" e "Codici per etichette".
Sarei negligente se non sostenessi l'uso del numero 1 per POR e 0 per test (1: test e 0: POR se preferisci). Utilizzando la proprietà della colonna Etichetta valore, possiamo far apparire questi valori come se fossero "test" e "POR", ma internamente sono 0 e 1.
Poiché i valori sono numerici, i calcoli possono essere eseguiti utilizzando formule di colonna e riga native. Nel caso di 1 e zeri, la somma dà il numero di 1, mentre la media dà la proporzione di quelli. In questo esempio, se memorizziamo POR come 0 e "test" come 1, possiamo trovare il numero di test in una determinata riga semplicemente selezionando tutte le colonne di interesse, facendo clic con il tasto destro e scegliendo Nuova colonna formula > Combina > Somma dal menu a comparsa.
Di seguito è riportata un'immagine di come appare nella pratica. Le celle sembrano contenere testo, poiché le parole POR e test sono giustificate a sinistra, ma quando si fa clic su una cella è possibile vedere che in realtà JMP sta memorizzando un numero internamente, in modo simile a quanto avviene con date e ore.

Facendo clic sull'asterisco * a destra dei nomi delle colonne nel riquadro Colonne (al centro a sinistra della tabella dati), possiamo selezionare "Etichette valori" per visualizzare le impostazioni correnti della proprietà:

Saluti,
Brady
Ri: Conteggio dei valori in ogni rigabella idea
Ri: Conteggio dei valori in ogni rigaCIAO,
Ancora un altro modo prevede di concatenare tutte le colonne con una trasformazione con 1 clic.
Poiché "test" è 1 carattere in più rispetto a POR e non ci sono dati mancanti, la stringa risultante aumenterà di 1 carattere per ogni "test" contenuto, rispetto a una stringa di soli "POR".
Per concatenare, selezionare le colonne di interesse e fare clic con il tasto destro, selezionando come di seguito. Quindi rinominare la colonna "concat" per brevità.

Nella tabella di esempio seguente sono presenti 6 colonne di interesse; una stringa con solo "POR" avrebbe quindi 6 * 3 = 18 caratteri.
Utilizziamo quindi le formule:
length(:concat) - 18 per il numero di "test" == n_test.
E
6 - n_test per il numero di "POR".
In generale, per n_test useremo (length(:concat) - 18)/k, dove k è la differenza di caratteri tra le 2 frasi. Qui, poiché k == 1, lo omettiamo.

Saluti,
Brady
Ri: Conteggio dei valori in ogni rigaHo creato in JMP la tabella come da te fornito

Ho quindi creato una nuova colonna e ho applicato la seguente formula a quella colonna
count = 0;
For( i = 1, i <= 4, i++,
count = Sum( count, Contains( As Column( i ), "test" ) )
);
count;
Tieni presente che il ciclo For() arriva solo fino a 4, perché ci sono solo 4 colonne nella tabella da elaborare
Fornisce i seguenti risultati

Ho allegato la tabella dei dati
Consiglio vivamente di leggere il documento Alla scoperta di JMP, disponibile nel menu a discesa Guida
Ri: Conteggio dei valori in ogni rigaper tutti, ma è per riga
come se ogni riga conta quante volte un valore è apparso all'interno di quella riga e poi alla fine di quella riga scrivo il valore "conteggio"
vedi il mio esempio qui sotto ho aggiunto qualche tabellaRi: Conteggio dei valori in ogni rigaEhi, questo non funziona
per esempio se lo eseguo su this
| POR | POR | POR | POR |
| POR | POR | POR | POR |
| test | POR | POR | test |
| test | POR | POR | test |
| POR | POR | POR | POR |
| POR | POR | POR | POR |
| test | POR | POR | test |
| test | POR | test | test |
i conteggi risultano 0
quello che mi aspetterei quando eseguo il "test" è: 0,2,2,0,0,2,3
quindi l'output è così:
| POR | POR | POR | POR | 0 |
| POR | POR | POR | POR | 0 |
| test | POR | POR | test | 2 |
| test | POR | POR | test | 2 |
| POR | POR | POR | POR | 0 |
| POR | POR | POR | POR | 0 |
| test | POR | POR | test | 2 |
| test | POR | test | test | 3 |
Ri: Conteggio dei valori in ogni rigaEcco le formule che rappresentano un modo per calcolare i conteggi
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;
Ri: Conteggio dei valori in ogni rigaPiccola domanda, ne hai bisogno per colonna o per tutto?