在“选择位置”和“列中选择名称”中使用参数你好,
我需要获取由 X 和 Y 两列组成的数据表,选择数据表的几行并命名所选内容。 这对应于在 xy 笛卡尔空间中选择二十个矩形并用数字(从 1 到 20)命名它们(我正在处理图像)。
我写了一个脚本,但它不起作用。 我想我需要解决两个问题:1)如何使用参数,参见“select where”的参数中的X1,X2,..? 2)如何在“列中名称选择”的参数中使用参数,请参阅n_patch?
非常感谢。
这是脚本:
dt = Current Data Table();
X0 = 2332;
Y0 = 558;
n_patch = 0;
delta_x = 100;
delta_y = 100;
dist_y = 488;
dist_x = 656;
L_x = 500;
L_y = 500;
For( n_x = 1, n_x <= 4, n_x++,
For( n_y = 1, n_y <= 5, n_y++,
Xc = X0 - (n_x - 1) * (dist_x) + L_x / 2;
Yc = Y0 + (n_y - 1) * (dist_y) + L_y / 2;
n_patch = n_patch + 1;
X1 = Xc - delta_x;
X2 = Xc + delta_x;
Y1 = Yc - delta_y;
Y2 = Yc + delta_y;
dt << Row Selection(
Select where( (:X >= X1 & :X <= X2) & (Y >= Y1 & Y <= Y2) )
);
dt << Name Selection in Column(
Column Name( "Patch#" ),
Selected( ("n_patch") ),
Unselected( "" )
);
)
);
高级统计建模自动化和脚本编写实验设计大规模定制回复:在“选择位置”和“列中选择名称”中使用参数非常感谢。 代码非常紧凑并且有效。
回复:在“选择位置”和“列中选择名称”中使用参数您可能使用的是较旧版本的 JMP,因此我不确定这些是否适合您(不使用列中的行选择或名称选择)。
您可以使用 << get rows where 获取感兴趣的行,然后使用 column()[rows] 设置值
dt << New Column("Patch#", Character);
For( n_x = 1, n_x <= 4, n_x++,
For( n_y = 1, n_y <= 5, n_y++,
Xc = X0 - (n_x - 1) * (dist_x) + L_x / 2;
Yc = Y0 + (n_y - 1) * (dist_y) + L_y / 2;
n_patch = n_patch + 1;
X1 = Xc - delta_x;
X2 = Xc + delta_x;
Y1 = Yc - delta_y;
Y2 = Yc + delta_y;
wantedRows = dt << get rows where(:X >= X1 & :X <= X2 & :Y >= Y1 & :Y <= Y2);
Column(dt, "Patch#")[wantedRows] = char(n_patch);
)
);回复:在“选择位置”和“列中选择名称”中使用参数您好,非常感谢您的及时回复。
您的代码对我非常有用,我认为我走在正确的道路上。 然而,仍然有一些行不通的地方。
我尝试运行您的代码,发现它添加了许多名称为“Patch#1”、“Patch#2”等的列,因此我更改了该行
Column Name( "Patch#" || char( n_patch ) )
和
Column Name( "Patch#")
因为我只想要一列名称为 Patch# 的列。
但代码没有选择我期望选择的内容。 它仅选择 patch5、10、15 和 20,而不选择其他补丁,而且所选行与补丁不对应。
因此,我不确定选择命令是否正常工作。
非常感谢您的帮助。
马塞洛.
回复:在“选择位置”和“列中选择名称”中使用参数你好@MFVIT ,
您需要确保在脚本中计算 X1 和 Y1 的值,而不是在数据表本身中查找某些内容。这个问题如图所示使用 Eval Insert、Eval Expr、Parse 和 Substitute 将一个表达式插入另一个表达式。 您可以通过使用 Eval( Eval Expr( ) ) 确保发生这种情况。 以下是使用您的代码和示例数据表的示例。
Names default to here(1);
dt = New Table( "Example Data",
Add Rows( 10000 ),
New Column( "X", Numeric, "Continuous", Format( "Best", 12 ),
Formula( Random Uniform( 0, 10000 ) ) ),
New Column( "Y", Numeric, "Continuous", Format( "Best", 12 ),
Formula( Random Uniform( 0, 10000 ) ) )
);
X0 = 2332;
Y0 = 558;
n_patch = 0;
delta_x = 100;
delta_y = 100;
dist_y = 488;
dist_x = 656;
L_x = 500;
L_y = 500;
For( n_x = 1, n_x <= 4, n_x++,
For( n_y = 1, n_y <= 5, n_y++,
Xc = X0 - (n_x - 1) * (dist_x) + L_x / 2;
Yc = Y0 + (n_y - 1) * (dist_y) + L_y / 2;
n_patch = n_patch + 1;
X1 = Xc - delta_x;
X2 = Xc + delta_x;
Y1 = Yc - delta_y;
Y2 = Yc + delta_y;
Eval( Eval Expr(
dt << Row Selection(
Select where( (:X >= Expr( X1 ) & :X <= Expr( X2 )) & (:Y >= Expr( Y1 ) & :Y <= Expr( Y2 ) ) )
);
) );
dt << run formulas;
dt << Name Selection in Column(
Column Name( "Patch#" || char( n_patch ) ),
Selected( "n_patch = " || char( n_patch ) ),
Unselected( "" )
);
)
);