リストを使用して複数の列を再コード化するFor Each 関数を使用して各列を調べ、条件式を使用して複数の列を再コード化したいと考えています。 次のコードでは正常に再コーディングできません。
//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 )}
)
);
私の予感としては、For Each 句の本体が間違っているのではないかと思われます。何らかの方法で列をより明確に呼び出す必要があるのではないかと思います。
「dt」としてのデータ テーブルは、コードの前半で確立されます。 記録のために言っておきますが、スクリプトを使用してもエラーは発生しませんが、列は正しく記録されません。 ありがとう。
消費者および市場調査Re: リストを使用して複数の列を再コード化する私は常に列名を使用し、列を操作したり列から値を取得したりする必要があるときに列名を使用する方法を考える (または少なくとも試してみる) のが好きです。 通常、これは As Column()、Column()、または Eval() のいずれかですが、場合によっては、より創造的にする必要があります。
時々役立つかもしれないいくつかのスニペットを以下に示します。
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);
こちらもご覧くださいJMP 16 での Name() パーサー ディレクティブの廃止と名前 (jmp.com) Name("列名") について
Re: リストを使用して複数の列を再コード化するご協力いただきありがとうございます! ジョーダン ヒラーのおかげで、あなたの最初の返信を理解することができました。 実際の列のリストを使用すると機能しないのに、列のリストを文字列として使用することが機能する理由はわかりませんが、とにかく今はあなたの解決策に従います。 列名がどのように呼び出されるかも分かりやすくなりました。 良い思い出です。 再度、感謝します。
Re: リストを使用して複数の列を再コード化するRecode Columns に必要な列の形式がわかりません。 ColNames に異なる構文を使用していることがわかります (列名のリストを使用していますが、列を参照する古い方法を使用しています (Name("col name") は "col name"n に置き換えられています) 、また、ターゲット列で異なる列を使用しています。
このデータテーブルを使用して例を実行すると、次のようになります。

これで終わります

新しいテーブルと 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: リストを使用して複数の列を再コード化するここのコードを私の目的(リストのいくつかの列)に合わせて調整しましたが、まだ機能しません。
ColNames = {dt:Name("col 1"), dt:Name("col 2"),
dt:Name("col 3"), dt:Name("col4")};
For Each({listitem}, ColNames,
dt<<RECODE column=""></RECODE>列ごとに再コード化するということですか?
Re: リストを使用して複数の列を再コード化するおそらく、Recode の代わりに Recode Column を使用して、列の参照方法を少しいじる必要があるかもしれません。
これは機能しているようです。少なくとも列 1 の 1000 が大部分を置き換えます。
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))
)
);