Recoder plusieurs colonnes avec la listeJe souhaite recoder plusieurs colonnes à l'aide d'une formule conditionnelle en parcourant chaque colonne avec une fonction For Each. Je n'arrive pas à recoder avec succès avec le code suivant :
//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 )}
)
);
Mon intuition est que le corps de la clause For Each est incorrect - que je dois en quelque sorte appeler les colonnes plus clairement.
La table de données en tant que "dt" est établie plus tôt dans le code. Pour mémoire, je n'obtiens pas d'erreur lorsque j'utilise le script mais les colonnes ne sont pas recodées correctement. Merci.
Études de consommation et de marchéRe : Recoder plusieurs colonnes avec la listeJ'aime toujours utiliser des noms de colonnes, puis comprendre (ou du moins essayer...) comment les utiliser lorsque j'ai besoin de manipuler des colonnes/d'obtenir des valeurs à partir de colonnes. Habituellement, il s'agit de As Column(), Column() ou Eval(), mais parfois vous devez faire preuve de plus de créativité.
Voici quelques extraits qui pourraient être utiles de temps en temps :
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);
Regarde aussi Abandon de la directive d'analyseur Name() dans JMP 16 et Noms (jmp.com) concernant Name("col name")
Re : Recoder plusieurs colonnes avec la listeMerci pour votre aide! Jordan Hiller m'a aidé à comprendre votre réponse initiale. Je ne comprends pas pourquoi l'utilisation de la liste des colonnes en tant que chaînes fonctionne alors que l'utilisation d'une liste de colonnes réelles ne fonctionne pas, mais je suis quand même votre solution maintenant. Utile pour voir comment les noms de colonne sont également appelés maintenant. Bon rappel. Merci encore.
Re : Recoder plusieurs colonnes avec la listeJe ne suis pas sûr des formats de colonnes requis par Recode Columns. Vous pouvez voir que nous utilisons différentes syntaxes pour ColNames (j'utilise une liste de noms de colonnes et vous utilisez l'ancienne méthode pour référencer les colonnes (Name("col name"), il a été remplacé par "col name"n) , nous utilisons également différentes colonnes dans Target Column.
Si exécutez l'exemple que j'ai donné avec cette table de données :

je me retrouve avec ça

Voici un exemple mis à jour avec une nouvelle table et plus de colonnes ajoutées à la liste 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))
)
);
Re : Recoder plusieurs colonnes avec la listeJ'ai adapté le code ici pour mes besoins (plusieurs colonnes dans la liste) mais cela ne fonctionne toujours pas :
ColNames = {dt:Name("col 1"), dt:Name("col 2"),
dt:Name("col 3"), dt:Name("col4")};
For Each({listitem}, ColNames,
dt<<RECODE column=""></RECODE>Me suggériez-vous d'aller colonne par colonne pour recoder ?
Re : Recoder plusieurs colonnes avec la listePeut-être que vous avez juste besoin d'utiliser Recode Column au lieu de Recode, puis de bricoler un peu sur la façon de référencer sur les colonnes.
Cela semble fonctionner, au moins il remplace trop par 1000 dans la 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))
)
);