script jsl per ricodificare più colonneCarissimi,
Sto cercando di ricodificare più colonne utilizzando il seguente script (anche in allegato insieme a una tabella di dati di esempio). Ho provato diverse modifiche ma non funziona. I valori nelle colonne scompaiono invece di essere ricodificati.
Apprezzo qualsiasi aiuto.
Grazie molto,
Marcello.
dt3 = Current Data Table();
n3 = dt3 << Get Column Names();
Show( n3 );
lstColNames_n3 = dt3 << Get Column Names();
Show( lstColNames_n3 );
Show( lstCols_n3 );
lstCols_n3 = {};
For( i = 1, i <= N Items( lstColNames_n3 ), i++,
colName = lstColNames_n3[i];
col = Column( dt3, i );
Insert Into( lstCols_n3, col );
);
Show( lstCols_n3 );
For Each Row(
For( i = 1, i <= N Items( lstColNames_n3 ), i++,
As Column( lstColNames_n3[i] ) = Match( As Column( lstColNames_n3[i] ),
"1", "too low",
"2", "too low",
"3", "right",
"4", "too high",
"5", "too high"
)
)
);
SceneggiaturaRe: script jsl per ricodificare più colonneGrazie!
Re: script jsl per ricodificare più colonneUna soluzione alternativa sarebbe la creazione di una nuova colonna con una formula basata sulla colonna che si desidera ricodificare.
Quindi elimina la colonna originale
Re: script jsl per ricodificare più colonneGrazie molto!
Re: script jsl per ricodificare più colonneEcco la soluzione che utilizza la funzione Recode scritta in JSL È molto più veloce dell'elaborazione riga per riga
Names Default To Here( 1 );
dmdt = current data table();
nc = dmdt << get column names( Character );
For( i = 1, i <= N Items( nc ), i++,
col = Column( dt, nc[i] );
colname = col << getname();
Eval(
Parse(
Eval Insert(
"\[
dmdt << Recode Column(
:Name("^colname^"),
{Map Value( _rcOrig,
{ "1", "too low",
"2", "too low",
"3", "right",
"4", "too high",
"5", "too high"},
Unmatched( _rcNow ) )},
Update Properties( 1 ),
Target Column( :Name("^colname^") )
);
]\"
)
)
);
);
Re: script jsl per ricodificare più colonneGrazie mille, il tuo codice con l'array associativo ha funzionato perfettamente.
Ho provato anche l'altra opzione, aggiungendo
Match(As Column( lstColNames_n3[i])[Row()],
ma non ha funzionato.
Ma ho risolto il mio problema.
Grazie molto.
Re: script jsl per ricodificare più colonneHo modificato la mia risposta precedente, dovrebbe aiutare con la ricodificaRe: script jsl per ricodificare più colonneAvrei bisogno di ricodificare i valori. Grazie.
Re: script jsl per ricodificare più colonneDevi ricodificare i valori o potresti utilizzare la proprietà della colonna Value Labels (in questo modo non perderai i dati originali), esempio: Ricodifica più colonne con lo script JSL
Modificare:
E se devi ricodificarli sul posto, ci sono diversi modi per farlo (io userei Associative Array):
Names Default To Here(1);
dt3 = current data Table ();
n3 = dt3 << Get Column Names(string);
show(n3);
//create associative array to use matching keys to values
matchAa = Associative Array(
{"1","2","3","4","5"},
{"too low","too low","right","too high","too high"}
);
show(matchAa);
//loop over column names
For(i = 1, i <= N Items(n3), i++,
//refer to column and use set each value to update values
Column(dt3, n3[i]) << Set Each Value(
matchAa[AsColumn(n3[i])[Row()]]
);
);
E per la tua soluzione penso che ci sia un problema nel modo in cui fai riferimento ai valori nella funzione Match e devi aggiungere [Row()] per ottenere valori singoli per Matching
Match(As Column( lstColNames_n3[i])[Row()],
Modifica2:
Aggiunto script di esempio completo come allegato