Ricodifica più colonne con l'elencoVoglio ricodificare più colonne utilizzando una formula condizionale passando attraverso ogni colonna con una funzione For Each. Non sono in grado di ricodificare correttamente con il seguente codice:
//Create list of columns to be recoded
ColNames = {dt:Name( "col 1" ), dt:Name( "col 2" ), dt:Name( "col 3" ), dt:Name( "col 4" )};
For Each( {listitem}, ColNames,
Recode(
listitem,
{Lowercase( _rcNow ), If( Contains( _rcNow, "too much" ),
"1000",
_rcNow
), Regex( _rcNow, "\D*(\d+\.?\d*)\D*", "\1", GLOBALREPLACE )}
)
);
La mia impressione è che il corpo della clausola For Each non sia corretto, che devo in qualche modo richiamare le colonne in modo più chiaro.
La tabella dati come "dt" è stabilita in precedenza nel codice. Per la cronaca, non ricevo un errore quando utilizzo lo script ma le colonne non vengono ricodificate correttamente. Grazie.
Consumatori e ricerche di mercatoRi: Ricodificare più colonne con elencoMi piace sempre usare i nomi delle colonne e poi capire (o almeno provare a ...) come usarli quando devo manipolare le colonne / ottenere valori dalle colonne. Di solito è uno tra As Column(), Column() o Eval(), ma a volte devi essere più creativo.
Ecco alcuni frammenti che potrebbero tornare utili di tanto in tanto:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// set name which would usually break
Column(dt, "name") << Set Name("@na-me");
str_col_list = dt << Get Column Names("String");
show(str_col_list);
column_list = dt << Get Column Reference(str_col_list);
show(column_list);
ascolumn_list = Transform Each({col_name}, str_col_list,
Name Expr(As Column(dt, col_name))
);
show(ascolumn_list);
Vedi anche Deprecazione della direttiva parser Name() in JMP 16 E Nomi (jmp.com) per quanto riguarda Nome("col nome")
Ri: Ricodificare più colonne con elencoGrazie per l'aiuto! Jordan Hiller mi ha aiutato a capire la tua risposta originale. Non capisco perché l'utilizzo dell'elenco di colonne come stringhe funzioni mentre l'utilizzo di un elenco di colonne effettive non funziona, ma ora seguo comunque la tua soluzione. Utile vedere come vengono chiamati anche i nomi delle colonne ora. Buon promemoria. Grazie ancora.
Ri: Ricodificare più colonne con elencoNon sono sicuro di quali formati per le colonne richieda Recode Columns. Puoi vedere che stiamo usando diverse sintassi per ColNames (sto usando un elenco di nomi di colonne e stai usando il vecchio modo di fare riferimento alle colonne (Name("col name"), è stato sostituito da "col name"n) , inoltre stiamo utilizzando colonne diverse nella colonna di destinazione.
Se esegui l'esempio che ho fornito con questa tabella di dati:

Finisco con questo

Ecco un esempio aggiornato con una nuova tabella e più colonne aggiunte all'elenco ColNames
Names Default To Here(1);
dt = New Table("Untitled 2",
Add Rows(3),
Compress File When Saved(1),
New Column("col 1", Character, "Nominal", Set Values({"1000", "too much", "too much"})),
New Column("col 2",
Character,
"Nominal",
Set Values({"too much", "", ""}),
Set Display Width(65)
),
New Column("col 3", Character, "Nominal", Set Values({"c", "", "too much"})),
New Column("col 4", Character, "Nominal", Set Values({"d", "", ""}))
);
wait(1);
//Create list of columns to be recoded
ColNames = {"col 1", "col 2", "col 3", "col 4"};
For Each({listitem}, ColNames,
dt << Recode Column(
//As Column(dt, listitem),
As Column(listitem),
{Lowercase(_rcNow), If(Contains(_rcNow, "too much"),
"1000",
_rcNow
), Regex(_rcNow, "\D*(\d+\.?\d*)\D*", "\1", GLOBALREPLACE)},
Update Properties(1),
Target Column(Column(listitem))
)
);
Ri: Ricodificare più colonne con elencoHo adattato il codice qui per i miei scopi (diverse colonne nell'elenco) ma continua a non funzionare:
ColNames = {dt:Name("col 1"), dt:Name("col 2"),
dt:Name("col 3"), dt:Name("col4")};
For Each({listitem}, ColNames,
dt<<RECODE column=""></RECODE>Stavi suggerendo di andare colonna per colonna per ricodificare?
Ri: Ricodificare più colonne con elencoForse hai solo bisogno di usare Recode Column invece di Recode e poi armeggiare un po' su come fare riferimento alle colonne.
Sembra funzionare, almeno sostituisce troppo con 1000 in col 1:
Names Default To Here(1);
dt = New Table("Untitled 2",
Add Rows(1),
New Column("col 1", Character, "Nominal", Set Values({"too much"})),
New Column("col 2", Character, "Nominal", Set Values({"a"})),
New Column("col 3", Character, "Nominal", Set Values({"c"})),
New Column("col 4", Character, "Nominal", Set Values({"d"}))
);
//Create list of columns to be recoded
ColNames = {"col 1"};
For Each({listitem}, ColNames,
dt << Recode Column(
//As Column(dt, listitem),
AsColumn(listitem),
{Lowercase(_rcNow), If(Contains(_rcNow, "too much"),
"1000",
_rcNow
), Regex(_rcNow, "\D*(\d+\.?\d*)\D*", "\1", GLOBALREPLACE)},
Update Properties(1),
Target Column(Column(listitem))
)
);