用列表重新編碼多列我想通過使用 For Each 函數遍歷每一列,使用條件公式對多列進行重新編碼。 我無法使用以下代碼成功重新編碼:
<
//創建要重新編碼的列列表
ColNames = {dt:Name("col 1"), dt:Name("col 2"),
dt:Name("col 3"), dt:Name("col 4")};
對於每個({listitem},ColNames,重新編碼(
項目清單,
{小寫(_rcNow),如果(包含(_rcNow,“太多”),
"1000",
_rcNow
), 正則表達式( _rcNow, "\D*(\d+\.?\d*)\D*", "\1", GLOBALREPLACE )}
));
我的預感是 For Each 子句的主體是不正確的——我必須以某種方式更清楚地標出列。
作為“dt”的數據表是在代碼的前面建立的。 作為記錄,我在使用腳本時沒有收到錯誤,但列未正確重新編碼。 謝謝。
腳本回复:用列表重新編碼多個列也許您只需要使用 Recode Column 而不是 Recode,然後稍微修改一下如何引用列。
這似乎有效,至少它在 col 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))
)
);回复:用列表重新編碼多個列我出於我的目的調整了這裡的代碼(列表中的幾列),但它仍然不起作用:
ColNames = {dt:Name("col 1"), dt:Name("col 2"),
dt:Name("col 3"), dt:Name("col4")};
For Each({listitem}, ColNames,
dt<<RECODE column=""></RECODE>你是在建議我逐列重新編碼嗎?
回复:用列表重新編碼多個列我不確定 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))
)
);
回复:用列表重新編碼多個列謝謝你的幫助! Jordan Hiller 幫助我理解了您的原始回复。 我不明白為什麼使用列列表作為字符串有效,而使用實際列列表不起作用,但無論如何我現在都遵循您的解決方案。 有助於了解現在如何調用列名。 好提醒。 再次感謝。