Mehrere Spalten mit Liste neu kodierenIch möchte mehrere Spalten mithilfe einer bedingten Formel neu kodieren, indem ich jede Spalte mit einer For Each-Funktion durchgehe. Ich kann mit dem folgenden Code nicht erfolgreich neu codieren:
//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 )}
)
);
Ich vermute, dass der Hauptteil der For Each-Klausel falsch ist – dass ich die Spalten irgendwie klarer benennen muss.
Die Datentabelle als „dt“ wird früher im Code erstellt. Fürs Protokoll: Ich erhalte keine Fehlermeldung, wenn ich das Skript verwende, aber die Spalten werden nicht richtig neu codiert. Danke.
Verbraucher- und MarktforschungBetreff: Mehrere Spalten mit Liste neu kodierenIch verwende immer gerne Spaltennamen und überlege dann (oder versuche es zumindest...), wie ich sie verwenden kann, wenn ich Spalten manipulieren bzw. Werte aus Spalten abrufen muss. Normalerweise ist es As Column(), Column() oder Eval(), aber manchmal muss man kreativer werden.
Hier sind einige Auszüge, die von Zeit zu Zeit nützlich sein könnten:
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);
Siehe auch Die Parser-Direktive Name() wird in JMP 16 nicht mehr unterstützt Und Namen (jmp.com) bezüglich Name("col name")
Betreff: Mehrere Spalten mit Liste neu kodierenVielen Dank für Ihre Hilfe! Jordan Hiller hat mir geholfen, Ihre ursprüngliche Antwort zu verstehen. Ich verstehe nicht, warum die Verwendung der Spaltenliste als Zeichenfolgen funktioniert, während die Verwendung einer Liste tatsächlicher Spalten nicht funktioniert, aber ich folge jetzt trotzdem Ihrer Lösung. Es ist auch hilfreich zu sehen, wie Spaltennamen jetzt aufgerufen werden. Gute Erinnerung. Danke noch einmal.
Betreff: Mehrere Spalten mit Liste neu kodierenIch bin nicht sicher, welche Formate für Spalten Recode Columns erfordert. Sie können sehen, dass wir unterschiedliche Syntaxen für Spaltennamen verwenden (ich verwende eine Liste von Spaltennamen und Sie verwenden die alte Methode zum Verweisen auf Spalten (Name("Spaltenname"), es wurde durch "Spaltenname" ersetzt).) Außerdem verwenden wir verschiedene Spalten in der Zielspalte.
Wenn ich das von mir angegebene Beispiel mit dieser Datentabelle ausführen würde:

Ich schließe damit ab

Hier ist ein aktualisiertes Beispiel mit einer neuen Tabelle und weiteren Spalten, die zur ColNames-Liste hinzugefügt wurden
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))
)
);
Betreff: Mehrere Spalten mit Liste neu kodierenIch habe den Code hier für meine Zwecke angepasst (mehrere Spalten in der Liste), aber er funktioniert immer noch nicht:
ColNames = {dt:Name("col 1"), dt:Name("col 2"),
dt:Name("col 3"), dt:Name("col4")};
For Each({listitem}, ColNames,
dt<<RECODE column=""></RECODE>Haben Sie vorgeschlagen, dass ich Spalte für Spalte vorgehe, um neu zu kodieren?
Betreff: Mehrere Spalten mit Liste neu kodierenVielleicht müssen Sie einfach Recode Column anstelle von Recode verwenden und dann ein wenig daran basteln, wie Sie auf Spalten verweisen.
Das scheint zu funktionieren, zumindest ersetzt es zu viel durch 1000 in Spalte 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))
)
);