名称引用一个奇怪的列名称我正在尝试将列名插入到拟合模型表达式中。 为此,我需要转义列名称中的奇怪字符,以便我们使用 :"name"n 约定。 那么如何从字符串列名称转换为这种格式呢?
colListY = {"Plating Thickness (m\!"\!")"};
//This doesn't work
newcolumnref = eval insert("\[:"^colListY[1]^"n]\");
//Looking for this end result
:"Plating Thickness (m\!"\!")"n然后我可以将其插入到任何地方,例如:
insert into(expr(Y()), newcolumnref);
有人知道一个可靠的方法来做到这一点吗?
数据探索和可视化回复:名称引用了一个奇怪的列名@马克贝利
啊,太简单了!伟大的!!!
我很惊讶地听到@保罗丁:
https://community.jmp.com/t5/Discussions/Name-quote-a-strange-column-name/mp/415735/highlight/true#M66485
那
构建拟合模型脚本时,不能使用 column() 格式:</CODE><HR /></BLOCKQUOTE><P> </P><PRE><CODE class=" language-jsl">Fit Model(
//Y( :"Plating Thickness (m\!"\!")"n ), <- works
Y(column("Plating Thickness (m\!"\!"")), //<- does not work好的,如果是这样的话,获得列的最简单的解决方案是什么柱子() ...
现在我很惊讶地发现(通过运行你的代码)它确实有效。
然后回到旧的代码片段 - 但它不起作用。
哇!
如果将两行代码正好放在彼此的下面,那么这个难题就解决了:

-> 幸运的是,拟合模型不需要花哨的非 Column() 编码。
回复:名称引用了一个奇怪的列名Names Default To Here( 1 );
dt = New Table( "plating",
New Column( "Plating Thickness (m\!"\!")", Set Values( [1, 2, 3, 4] ) ),
New Column( "X", Set Values( [12, 26, 33, 39] ) )
);
col = Column( dt, "Plating Thickness (m\!"\!")" );
Fit Model(
Y( col ), // <- works :)
Effects( :X ),
Personality( "Standard Least Squares" ),
Run
);
回复:名称引用了一个奇怪的列名
dt = New Table( "plating",
Add Rows( 4 ),
New Column( "Plating Thickness (m\!"\!")",Set Values( [1, 2, 3, 4] )),
New Column( "X",Set Values( [12, 26, 33, 39] ))
);
colListY = {"Plating Thickness (m\!"\!")"};<BR /><BR /><BR />
newcolumnref = Name Expr(AsColumn(colListY[1])); // -> :"String"n<BR />
Fit Model(
//Y( :"Plating Thickness (m\!"\!")"n ), <- works
//Y(column("Plating Thickness (m\!"\!"")), //<- does not work
Y(newcolumnref), // <- works :)
Effects(:X),
Personality( "Standard Least Squares" )
);从
https://community.jmp.com/t5/Discussions/Need-help-with-expressions-column-references-formulas-and-column/mp/490220/highlight/true#M73282
回复:名称引用了一个奇怪的列名colListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );
Eval(
Eval Expr(
dt << New Column( "test",
Numeric,
"Continuous",
Format( "Fixed Dec", 12, 2 ),
Formula( Column( Expr( colListY[1] ) )[] ),
Set Display Width( 78 )
)
)
);空的 [ ] 告诉 JMP 评估当前行的列。
像这样构建列公式可能会向 JMP 的公式计算器隐藏底层列依赖关系;看讨论。 如果您的公式列依赖于其他公式列,JMP 可能无法深入了解此间接方式以找出首先评估的内容。
回复:名称引用了一个奇怪的列名这会导致我出现列公式错误
回复:名称引用了一个奇怪的列名(没有尝试过,所以可能是错误的)
Formula( column(expr(colListY[1])) - :height ),
我认为你想要列内的 expr 。 这样,稍后会使用之前捕获的字符串来计算列函数。
回复:名称引用了一个奇怪的列名@XanGregg列公式不能以这种方式工作,特殊的引用方法可以工作:
colListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );
eval(eval expr(dt << New Column( "test",
Numeric,
"Continuous",
Format( "Fixed Dec", 12, 2 ),
Formula( expr(column(colListY[1])) - :height ),
Set Display Width( 78 )
)));它生成一个函数列,其中公式为:
Column( "Plating Thickness (m\!"\!")" ) - /*###*/:height/*###*/
这不评价。
这会:
WrapColumns = Function({ColName},{default local},
ReturnList = {};
If(is list(ColName),
For(i=1, i<=n items(ColName), i++,
insert into(ReturnList, parse(":" || Log Capture( Print( ColName[i] ) ) || "n"))
);
,
insert into(ReturnList, parse(":" || Log Capture( Print( ColName ) ) || "n"))
);
Return(ReturnList);
);
eval(eval expr(dt << New Column( "test2",
Numeric,
"Continuous",
Format( "Fixed Dec", 12, 2 ),
Formula( expr(WrapColumns(colListY)[1]) - :height ),
Set Display Width( 78 )
)));您知道如何使用 column() 系统解决此问题吗?
回复:名称引用了一个奇怪的列名经过仔细测试并回顾了我的一些脚本后,我无法让它再次失败。 感谢您检查!
回复:名称引用了一个奇怪的列名这是一个很好的问题!
回复:名称引用了一个奇怪的列名这是一个很好的问题!
回复:名称引用了一个奇怪的列名@XanGregg现在我正在使用您的代码对其进行测试,它也可以在这里工作。 让我调查一下,看看是否可以更完整地分享失败的示例......
回复:名称引用了一个奇怪的列名为了搞笑,我把代码带回到 JMP 11.2.1,它运行得很好。
回复:名称引用了一个奇怪的列名您能详细说明“不起作用”部分吗? 我尝试了 JMP 15 的版本,以下内容似乎有效。 也许我遗漏了问题的一部分。
Data Table( "Big Class" ):weight << Set Name( "weight\!"\!"" );
Fit Model(
Y( Column( "weight\!"\!"" ) ),
Effects( :age, :sex, :height ),
Personality( "Standard Least Squares" ),
Run()
);
回复:名称引用了一个奇怪的列名为任何观看者解释一下: print 函数做了两件事:它转义内部引号(和其他特殊情况)并添加外部引号。 这会生成一个有效的字符串,然后 Paul 的代码在前面添加一个 : ,在后面添加一个 n ,并将结果解析为 JSL列名常量。 可能有也可能没有实际的列列名常量在脚本中使用时可以附加到。 当 Paul 的代码运行时,该列不需要存在。 如果没有 print() 函数,我不确定我会使用什么函数来完成转义(规则太复杂,我自己无法编写。)因为原始名称包含嵌入式引号,所以需要转义才能完成变成了一个列名常量。
如果数据表是打开的,您可以以大致相同的方式使用column()函数来获取列对象(我很确定)可以用在所有相同的地方列名常量可以出现。 那列对象指的是一个真实的列,至少在表关闭之前是这样。 启动一个过期的平台列对象或一个列名常量与表列不匹配的内容将产生预期的错误消息。
@XanGregg
回复:名称引用了一个奇怪的列名根据 Craige 的反馈进行了更新,感谢 1/i!
WrapColumns = Function({ColName},{default local},
ReturnList = {};
If(is list(ColName),
For(i=1, i<=n items(ColName), i++,
insert into(ReturnList, parse(":" || Log Capture( Print( ColName[i] ) ) || "n"))
);
,
insert into(ReturnList, parse(":" || Log Capture( Print( ColName ) ) || "n"))
);
Return(ReturnList);
);回复:名称引用了一个奇怪的列名它是太复杂。 您可能可以用trim()替换regex(),因为这就是它所做的一切。 最初我以为它会删除 print() 留下的外部引号。 (编辑:并且根本不需要修剪要解析的输入!)
在您的示例中,您可能需要 [i] 的地方有 [1]。
回复:名称引用了一个奇怪的列名谢谢克雷格,这似乎比应有的更复杂,但它有效:)
对于任何尝试这样做的人,我将克雷格的解决方案放入一个函数中:
WrapColumns = Function({ColName},{default local},
ReturnList = {};
If(is list(ColName),
For(i=1, i<=n items(ColName), i++,
insert into(ReturnList, parse(":" || Regex( Log Capture( Print( ColName[1] ) ), "^\s*(.*)\s*$", "\1" ) || "n");)
);
,
insert into(ReturnList, parse(":" || Regex( Log Capture( Print( ColName ) ), "^\s*(.*)\s*$", "\1" ) || "n");)
);
Return(ReturnList);
);回复:名称引用了一个奇怪的列名更多注意事项:
我在列函数中明确引用了该表。 如果打开多个表可能会有所不同。
如果您要连接字符串,这可能可以做到;即使不需要(例如高度),您也可以随时使用 :"height"n。
colreftxt = ":" || Regex( Log Capture( Print( colListY[1] ) ), "^\s*(.*)\s*$", "\1" ) || "n";
write(colreftxt);
:"镀层厚度(m\!"\!")"n
</CODE>这可能是正确的。 表达式操作可能比解析这样组装的文本更容易。</P><P> </P><P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-415759" slang="en-US" mode="NONE">回复:名称引用了一个奇怪的列名</LINGO-SUB><LINGO-BODY id="lingo-body-415759" slang="en-US" mode="NONE"><P>尝试这两个答案的组合:</P><PRE><CODE class=" language-jsl">colListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );
script = Expr(
Fit Model(
Y( F1 ),
Effects( :height ),
Personality( "Standard Least Squares" ),
Run( F1 << {Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ), Plot Effect Leverage( 1 )} )
)
);
Substitute Into( script, Expr( F1 ), Column( dt, colListY[1] ) );
Write( Name Expr( script ) );
/*
Fit Model(
Y( Column( "Plating Thickness (m\!"\!")" ) ),
Effects( :height ),
Personality( "Standard Least Squares" ),
Run(
Column( "Plating Thickness (m\!"\!")" ) << {Plot Actual by Predicted( 1 ),
Plot Residual by Predicted( 1 ), Plot Effect Leverage( 1 )}
)
)
*/
Eval( script );
run with column substitutedrun with column substituted用替换的列运行
回复:名称引用了一个奇怪的列名@tx尼尔森问题是,在构建拟合模型脚本时,无法使用 column() 格式:
Fit Model(
//Y( :"Plating Thickness (m\!"\!")"n ), <- works
Y(column("Plating Thickness (m\!"\!"")), //<- does not work
Effects(
:"Shift-temp"n, :Position, :Subgroup, :"Shift-temp"n * :Position,
:"Shift-temp"n * :Subgroup, :Position * :Subgroup
),
Personality( "Standard Least Squares" )
);@Craige_Hales用户使用 Col 列表框()选择列,然后我将 << get items 消息传递给它。 这给了我一个字符串形式的列名列表。 我可以在表中找到这些列名称并找到列号,但是在组装效果表达式时,此方法不允许我构建如上所示的交互。
有没有办法进行表达式串联以从字符串到带有名称转义的 col 引用?
回复:名称引用了一个奇怪的列名如果您可以避免以字符串形式获取列名称,而是获取列对象,则可能会更容易。 下面, cols 是列对象的列表,而不是它们的名称。
colListY = {"Plating Thickness (m\!"\!")"};
dt = Open( "$sample_data/big class.jmp" );
dt:age << setname( colListY[1] );
cols = dt << getcolumnnames;// don't use the string keyword
/* {name, "Plating Thickness (m\!"\!")"n, sex, height, weight} */
script = Expr(
Fit Model(
Y( :weight ),
Effects( F1 ),
Personality( "Standard Least Squares" ),
Run(
:weight << {Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ),
Plot Effect Leverage( 1 )}
)
)
);
Substitute Into( script, Expr( F1 ), cols[2] );
Write( Name Expr( script ) );
/*
Fit Model(
Y( :weight ),
Effects( "Plating Thickness (m\!"\!")"n ),
Personality( "Standard Least Squares" ),
Run(
:weight << {Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ),
Plot Effect Leverage( 1 )}
)
);
*/回复:名称引用了一个奇怪的列名您可以使用 Column 或 As Column 函数来为复杂的列名称提供保护
colListY = {"Plating Thickness (m\!"\!")"};
newcolumnref = eval insert("column(\!"^colListY[1]^\!")");