如何将公式应用于另一个表的所有列?我正在尝试获取一个表并将移动平均值应用于每个函数的每个列。下面的脚本是我正在尝试的,基于我在另一个线程中看到的内容。目标是创建一个新表,然后在引用原始表的同时应用该函数。但是,我一直收到范围数据表访问错误。
Test = Open("C:\Users\abrokaw\Desktop\JMP MA Test Table.jmp"); //open value data table
Testcols = Test << Get Column Names( string ); //get column names
TestMA = New Table( "Test Table Smoothed" ); //make new table
TestMA << add rows(nrows(Test)); //make new table match rows with raw table
For( i = 1, i <= N Cols( Test ), i++,
Eval(
Parse(
"TestMA << New Column( \!"MA_" || Testcols[i] || "\!",
numeric,
continuous,
formula( test:" ||
Testcols[i] || "Col Moving Average( :Value, 1, 2, 2 ) ) )'"
)
)
);
TestMA << delete columns("column 1");
自动化和脚本基础数据分析与建模回复:如何将公式应用于另一个表的所有列?您将对测试表中列的引用放在了错误的位置。此外,我从使用格式更改为使用“设置每个值”。最终计算结果相同,但该列不是公式列。这导致新数据表独立于测试表。我还更改了 For() 循环的结束值。由于您在前后都包括了 2 行,因此您无法计算超过 nrows-2 的值
names default to here(1);
Test = Open( "$SAMPLE_DATA/blood pressure.jmp" ); //open value data table
Testcols = Test << Get Column Names( string, continuous ); //get column names
TestMA = New Table( "Test Table Smoothed" ); //make new table
TestMA << add rows( N Rows( Test ) ); //make new table match rows with raw table
For( i = 1, i <= N Cols( Test )-2, i++,
Eval(
Parse(
"TestMA << New Column( \!"MA_" || Testcols[i] ||
"\!",
numeric,
continuous,
set each value( Col Moving Average( test:" || Testcols[i] || ", 1, 2, 2 ) ) )"
)
);
);
TestMA << delete columns( "column 1" );
最后,请使用预览屏幕顶部的 JSL 图标输入您的代码。这样更容易阅读。
该代码实际上不需要 Eval(Parse()) 代码的复杂性。它只需使用开放代码即可
Names Default To Here( 1 );
Test = Open( "$SAMPLE_DATA/blood pressure.jmp" ); //open value data table
Testcols = Test << Get Column Names( string, continuous ); //get column names
TestMA = New Table( "Test Table Smoothed" ); //make new table
TestMA << add rows( N Rows( Test ) ); //make new table match rows with raw table
For( i = 1, i <= N Cols( Test ) - 2, i++,
TestMA << New Column( "MA_" || Testcols[i],
numeric,
continuous,
set each value( Col Moving Average( test:Testcols[i], 1, 2, 2 ) )
)
);
TestMA << delete columns( "column 1" );
回复:如何将公式应用于另一个表的所有列?您还可以使用子集复制列(这也会复制表格脚本等,这可能是一个好处,也可能是一个问题)。如果您使用子集选项并使用公式列进行计算,请记住使用复制公式 (0)
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
cont_cols = dt << Get Column Names(string, continuous);
ma_cols = {};
For(i = 1, i <= N Items(cont_cols), i++, // could use For Each but I try to avoid ... Each loops nowadays
//Eval(EvalExpr()) isn't necessary here but makes debugghing much easier
new_col = Eval(EvalExpr(
dt << New Column("MA_" || cont_cols[i], Numeric, Continuous, Formula( // I also try to avoid Set Each Value in cases like this so I use Formula here
Col Moving Average(Expr(NameExpr(AsColumn(dt, cont_cols[i]))), 1, 2, 2)
));
));
Insert Into(ma_cols, new_col << get name);
);
dt_new = dt << Subset(All Rows, Columns(ma_cols), Copy Formula(0), Output Table("Moving Averages"));
dt << Delete Columns(ma_cols);回复:如何将公式应用于另一个表的所有列?谢谢,Jim。此更改适用于我创建的测试数据集。但是,我仍然遇到一个问题,在实际数据集上出现相同的错误消息。我认为这与列名有关,因为当我将列名从实际数据集复制到测试集时,也会出现相同的错误。列名中的某些字符是否会导致此问题?