cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
  • Instantly extract effect sizes, F-ratios, and FDR-adjusted p-values from your models with the Calculate Effects Sizes extension, available now in the JMP Marketplace!
  • New to JMP? Join us Sept. 23-24 for the Early User Edition of Discovery Summit, tailor-made for new users. Register now for free!
  • Use World Cup data to build models, explore spatial relationships, and create informative visualizations in JMP. Register. July 17, 2 pm US Eastern Time.

Discussions

Solve problems, and share tips and tricks with other JMP users.
Choose Language Hide Translation Bar

JSL script to create or condition by looping thorough column names in a list

I'd like to create a function in jsl that takes a given list of column names as input, uses those columns to do a OR condition, and outputs a column with that looping OR formula. How do U do that? 

 

input_col_list = { "a", "b", "c"};
input_dt = dt;
x = 0.1;
input_dt << New Column("d", numeric, continuous, 
formula ( 
If(
(As Column("a") >= x  |  As Column("b") >= x  | As Column("c") >=  x), 
1,
0
) 
));

For above, I would like to make a function like below: 

my_func =
Function(
{input_dt, input_col_list, x},
{//local var},
// function body
...
Return As column("d")
);
1 ACCEPTED SOLUTION

Accepted Solutions
txnelson
Super User

Re: JSL script to create or condition by looping thorough column names in a list

Here is an example of one way to do it.......others may have more eloquent ways

Names Default To Here( 1 );
dt = 
// Open Data Table: Big Class.jmp
// → Data Table( "Big Class" )
Open( "$SAMPLE_DATA/Big Class.jmp" );

my_func = Function( {input_dt, input_col_list, x},
	{input_dt, input_col_list, x, the_cmd},
	input_dt << New Column( "d" );
	current data table(input_dt);
	the_cmd = "current data table():d << set formula( If(  current data table():\!"" ||
	Char( input_col_list[1] ) || "\!"n >= " || Char( x );
	For( i = 2, i <= N Items( input_col_list ), i++,
		the_cmd = the_cmd || " | current data table():\!"" || Char( input_col_list[i] ) || "\!"n >= "
		 || Char( x )
	);
	the_cmd = the_cmd || ", 1, 0) );";
	Eval( Parse( the_cmd ) );
);

input_col_listx = {"Height", weight};
dtx = Data Table( "big class" );
xx = 101;

theReturn = my_func( dtx, input_col_listx, xx );

 

Jim

View solution in original post

2 REPLIES 2
txnelson
Super User

Re: JSL script to create or condition by looping thorough column names in a list

Here is an example of one way to do it.......others may have more eloquent ways

Names Default To Here( 1 );
dt = 
// Open Data Table: Big Class.jmp
// → Data Table( "Big Class" )
Open( "$SAMPLE_DATA/Big Class.jmp" );

my_func = Function( {input_dt, input_col_list, x},
	{input_dt, input_col_list, x, the_cmd},
	input_dt << New Column( "d" );
	current data table(input_dt);
	the_cmd = "current data table():d << set formula( If(  current data table():\!"" ||
	Char( input_col_list[1] ) || "\!"n >= " || Char( x );
	For( i = 2, i <= N Items( input_col_list ), i++,
		the_cmd = the_cmd || " | current data table():\!"" || Char( input_col_list[i] ) || "\!"n >= "
		 || Char( x )
	);
	the_cmd = the_cmd || ", 1, 0) );";
	Eval( Parse( the_cmd ) );
);

input_col_listx = {"Height", weight};
dtx = Data Table( "big class" );
xx = 101;

theReturn = my_func( dtx, input_col_listx, xx );

 

Jim
jthi
Super User

Re: JSL script to create or condition by looping thorough column names in a list

Building this using strings is most likely most simple option as the expression is quite simple one. But... I don't like using Eval(Parse()) so here are few options which are not using that (second option might not do what you want with missing values)

Names Default To Here(1);

dt = New Table("Untitled 3",
	Add Rows(0),
	Compress File When Saved(1),
	New Column("a", Numeric, "Continuous", Format("Best", 12), Set Values([0,1])),
	New Column("b", Numeric, "Continuous", Format("Best", 12), Set Values([0,0])),
	New Column("c", Numeric, "Continuous", Format("Best", 12), Set Values([0,0]))
);
input_col_list = {"a", "b", "c"};
x = 0.1;

// using Or
or_expr = Expr(Or());
// https://community.jmp.com/t5/JSL-Cookbook-Archived/Insert-one-expression-into-another-using-Eval-Insert-Eval-Expr/ta-p/48998
For Each({col_name}, input_col_list,
	col_expr = Substitute(
		expr(_col_ref_ >= _comparison_value_),
		Expr(_col_ref_), NameExpr(AsColumn(Column(dt, col_name))),
		Expr(_comparison_value_), x
	);
	Insert Into(or_expr, Name Expr(col_expr));
);
// Show(name expr(or_expr));
Eval(EvalExpr(dt << New Column("d", Numeric, Continuous, Formula(
	If(Expr(name expr(or_expr)), 1, 0)
))));


// using matrix and any
col_refs = Transform Each({col_name}, input_col_list,
	Name Expr(As Column(Column(dt, col_name)));
);
Eval(EvalExpr(dt << New Column("d", Numeric, Continuous, Formula(
	Any(Matrix(Expr(col_refs)) >= Expr(x))
))));


// function of second option
create_check_col = function({dt, col_input, limit_val}, {Default Local},
	col_refs = Transform Each({col_name}, col_input,
		Name Expr(As Column(Column(dt, col_name)));
	);
	
	new_col = Eval(EvalExpr(dt << New Column("d", Numeric, Continuous, Formula(
		Any(Matrix(Expr(col_refs)) >= Expr(limit_val))
	))));
	
	return(new_col);
);
create_check_col(dt, input_col_list, x);
-Jarmo

Recommended Articles