Conteggio dei valori in ogni rigaHo uno script con col 1-6 in una lista
Sto cercando di scrivere uno script JSL che conterà quante volte appare la parola POR e quante volte appare la parola test
esempio sotto (l'ha fatto manualmente le ultime 2 colonne)

leggendo il forum capisco che devo convertire DT in una matrice, ma non sono in grado di farlo funzionare.
Grazie!
ScriptingRe: Conteggio dei valori in ogni rigaPiccola domanda, ne hai bisogno per colonna o per tutto?
Re: Conteggio dei valori in ogni rigaEcco le formule che sono 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;
Re: Conteggio dei valori in ogni rigaper tutti, ma è per fila
come ogni riga conta quante volte un valore è apparso all'interno di quella riga e poi alla fine di quella riga scrivo il valore "count"
guarda il mio esempio sotto ho aggiunto qualche tabellaRe: Conteggio dei valori in ogni rigaUn altro modo.
Formula della colonna per contare su tutta la riga
Questa formula utilizza l'indice della tabella dati per ottenere un elenco come {"test","POR","test","test"} per la riga 8.
Sopra ho usato 1::4, che diventa Index(1,4) come scorciatoia. Dovresti usare {Colonna1, Colonna 2, ... Colonna N} invece perché quando ho cambiato uno dei valori in "xyzzy" i valori delle colonne della formula non si sono aggiornati finché non ho forzato la ripetizione delle formule. Se JMP non può dire che una colonna fa riferimento a un'altra colonna, non verrà rivalutata.
Funziona meglio:
formula con nomi di colonna espliciti
Re: Conteggio dei valori in ogni rigaMolto bello........ma penso che tu sia entrato un po' nel grande abissoRe: Conteggio dei valori in ogni rigaLo so... ma è un metodo sorprendentemente buono dal punto di vista temporale. È interessante notare che il metodo concat, per quanto strano sia, è anche 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."));
Re: Conteggio dei valori in ogni rigaCiao,
Ancora un altro modo prevede la concatenazione di tutte le colonne con una trasformazione con 1 clic.
Poiché "test" è 1 carattere in più di POR e non hai dati mancanti, la stringa risultante aumenterà di 1 carattere per ogni "test" contenuto, rispetto a una puntura di soli "POR".
Per concatenare, selezionare le colonne di interesse e fare clic con il pulsante destro del mouse, selezionando come di seguito. Quindi rinominare la colonna "concat" per brevità.

Nella tabella di esempio sottostante, ci sono 6 colonne di interesse; una stringa con solo "POR" avrebbe quindi 6 * 3 = 18 caratteri.
Usiamo 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 useremmo (length(:concat) - 18)/k, dove k è la differenza di caratteri tra le 2 frasi. Qui, poiché k == 1, lo omettiamo.

Saluti,
Brady
Re: Conteggio dei valori in ogni rigaMi piace, Craige.
Sembra che anche la funzione 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"} ) );
Re: Conteggio valori in ogni rigaEhi, questo non funziona
per esempio se lo eseguo su questo
| 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 è questo:
| 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 |