用列表重新编码多列我想通过使用 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))
)
);