<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />你好
我想寻求一些有关 JMP 脚本的帮助。
我需要从当前表中自动检索多个列名,并使用公式为每一列创建一个新列。
例如,这是我的桌子
单元 ID 数据 1 数据 2 数据 3
1.1 1.2 1.1
B 1.2 1.2 1.0
C 1.3 1.2 1.4
D 1.1 1.2 1.1
1 - 我需要选择从 Data1 到 Data3 的列
2 - 需要创建 3 个新列,如下 Data1_Floor、Data2_Floor、Data3_Floor
3 - 每个新列都将使用原始列的数据计算为“Floor”函数:Data1_Floor = Floor (Data1), ...
我将不胜感激带有一些注释的 JSL 脚本示例
谢谢
亚历克斯
这应该这样做:
dt = current data table();
startcol = 2;
endcol = 4;
for (i = startcol, i <= endcol, i++,
data_col = column(i) << get name;
floor_col = data_col || "_Floor";
str = evalinsert(
"\[dt << new column( "^floor_col^", Numeric, Continuous, Format( "Best", 12 ),
formula(floor(:^data_col^)));]\");
eval(parse(str));
);
我还要问你:如果我的列的名称中没有公共字符串怎么办?我怎样才能让它工作,而不是“ifcontains”我必须告诉脚本将列从 B 列到 D 列,或者按数字顺序,从#2 到#4 列?
你很接近。您需要分配变量dt指向您的数据表。你可以这样做:
// Replace <YOUR table="" name=""> with the actual name of your table
dt = data table("<YOUR table="" name="">");
or with:
dt = current data table();</YOUR></YOUR>
嗨,PMroz,
感谢您的快速回复,我很感激。不幸的是,我是 JSL 的新手,所以我无法重现它,我尝试从“ col_list = ...”但我没有得到预期的输出。我一定做错了什么。
这是我想要得到的。
这是我的原始数据表:
| 单元 | 数据 1 | 数据 2 | 数据 3 |
| A | 12.35336 | 8.876483 | 3.207919 |
| 乙 | 9.838289 | 1.483974 | 2.5232 |
| C | 3.136643 | 6.092754 | 0.980194 |
| 丁 | 0.3593 | 4.639877 | 6.672549 |
我想运行脚本,该脚本将获取所有带有“Data”字符串的列,并且每个列都将生成新列,因此最终表将如下所示:
| 单元 | 数据 1 | 数据 2 | 数据 3 | 数据_1楼 | 数据_2楼 | 数据_3楼 |
| A | 12.35336452 | 8.876483446 | 3.207918972 | 12 | 8个 | 3个 |
| 乙 | 9.838288756 | 1.483974287 | 2.523200042 | 9 | 1个 | 2个 |
| C | 3.136642653 | 6.092754288 | 0.980193636 | 3个 | 6个 | 0 |
| 丁 | 0.359299803 | 4.639877062 | 6.672548555 | 0 | 4个 | 6个 |
你能尝试制作一个脚本来完成这个动作吗?
// Create data table
dt = New Table( "Floor Example",
Add Rows( 4 ),
New Column( "Unit ID", Character, Nominal, Set Values( {"A", "B", "C", "D"} ) ),
New Column( "Data1", Numeric, Continuous, Format( "Best", 12 ),
Set Values( [1.1, 1.2, 1.3, 1.1] ) ),
New Column( "Data2", Numeric, Continuous, Format( "Best", 12 ),
Set Values( [1.2, 1.2, 1.2, 1.2] ) ),
New Column( "Data3", Numeric, Continuous, Format( "Best", 12 ),
Set Values( [1.1, 1, 1.4, 1.1] ) ),
);
// Get the list of column names
col_list = dt << get column names(string);
// Loop over column names, searching for data columns
for (i = 1, i <= nitems(col_list), i++,
// If it's a Data column then add the floor formula
if (contains(col_list[i], "Data"),
data_col = ":" || col_list[i];
floor_col = col_list[i] || "_Floor";
// Build new column string dynamically and then execute it.
str = evalinsert(
"\[dt << New Column( "^floor_col^", Numeric, Continuous, Format( "Best", 12 ),
Formula( Floor( ^data_col^))
);]\");
eval(parse(str));
);
);