用列表重新編碼多列我想通過使用 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”的數據表是在代碼前面建立的。 作為記錄,我在使用腳本時沒有收到錯誤,但列沒有正確重新編碼。 謝謝。
消費者和市場研究回复:用列表重新編碼多列我總是喜歡使用列名,然後弄清楚(或至少嘗試...)當我需要操作列/從列中獲取值時如何使用它們。 通常它是 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("col name")
回复:用列表重新編碼多列感謝您的幫助! Jordan Hiller 幫助我理解了您最初的回复。 我不明白為什麼使用列列表作為字符串有效,而使用實際列列表不起作用,但我現在仍然按照您的解決方案進行操作。 有助於了解現在如何調用列名。 很好的提醒。 再次感謝。
回复:用列表重新編碼多列我不確定 Recode Columns 需要哪些格式的列。 您可以看到我們對 ColNames 使用了不同的語法(我使用的是列名列表,而您使用的是舊方法來引用列(名稱(“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))
)
);
回复:用列表重新編碼多列我出於我的目的調整了此處的代碼(列表中的幾列),但它仍然不起作用:
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 Column 而不是 Recode,然後稍微修改一下如何引用列。
這似乎有效,至少它在第 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))
)
);