cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
The Discovery Summit 2025 Call for Content is open! Submit an abstract today to present at our premier analytics conference.
Choose Language Hide Translation Bar

Adding Formula Columns based on Column Name List

Hi there! I'm trying to create a script that will generate Formula columns based on if a Column Name contains the right keyword. I think I'm misusing the way lists translate strings into other functions. Currently using JMP 17

 

Ptable = Current Data Table ();

col list = Ptable << Get Column Names(String);

if(debug == 1, Print(col list));

For(i=1, i<ncols(Ptable), i++,
	If( Contains( col list[i], "Pressure"),
		New Column("Column", Numeric, "Continuous", Format("Best", 12), Set Selected);
		Column("Column") << Set Formula(
			((15 / (0.016 *  /*###*/Num( :Resistance[1] ) /*###*/)) * Num( Column(col list[i]))
			-3.75) * 6.89476);
		Column("Column") << Set Name(col list[i] + " (kPa)");
	)
);
1 ACCEPTED SOLUTION

Accepted Solutions
jthi
Super User

Re: Adding Formula Columns based on Column Name List

You have to evaluate column correctly there. Expr(NameExpr(AsColumn())) is one option

Names Default To Here(1); 

dt = open("$SAMPLE_DATA/Big Class.jmp");

mycol1 = "height";
mycol2 = "weight";

Eval(EvalExpr(
	new_col = dt << New Column("Col", numeric, continuous, formula(
		Expr(NameExpr(AsColumn(dt, mycol1))) * Expr(NameExpr(AsColumn(dt, mycol2)))
	))	
));


show(new_col << get formula);

Insert one expression into another using Eval Insert, Eval Expr, Parse, and Substitute 

-Jarmo

View solution in original post

4 REPLIES 4
jthi
Super User

Re: Adding Formula Columns based on Column Name List

You have to evaluate column correctly there. Expr(NameExpr(AsColumn())) is one option

Names Default To Here(1); 

dt = open("$SAMPLE_DATA/Big Class.jmp");

mycol1 = "height";
mycol2 = "weight";

Eval(EvalExpr(
	new_col = dt << New Column("Col", numeric, continuous, formula(
		Expr(NameExpr(AsColumn(dt, mycol1))) * Expr(NameExpr(AsColumn(dt, mycol2)))
	))	
));


show(new_col << get formula);

Insert one expression into another using Eval Insert, Eval Expr, Parse, and Substitute 

-Jarmo

Re: Adding Formula Columns based on Column Name List

Nevermind! Issue was with my array clist not pulling the column names into a list!

 

@jthi Does naming a column also require an Expression Eval? The page you shared showed a Concat with Char( Array[#] ) working just fine, but I get an error trying to rename columns, code shown below. I'm not adding columns, so I'm not sure why there would be a mismatch between the N Cols and the counter in the For loop.

 

 

clist = Ptable << Get Column Names( String );
num_col = N Cols(Ptable);

For(i=3, i < num_col, i++,
	Column(i) << Set Name(Char(clist[i]) || " °C"); //Error on this line
);

"Subscript Range in access or evaluation of 'clist[ /*###*/i]' , clist[/*###*/i]"

 

jthi
Super User

Re: Adding Formula Columns based on Column Name List

Evaluation isn't required when setting the name. You have other issue in your code:

This part of your code doesn't really do anything

clist = {Ptable << Get Column Names( String )};

Remove {} around the << Get Column Names and then it should work

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

clist = dt << Get Column Names(String);
num_col = N Cols(dt);

For(i = 3, i < num_col, i++,
	Column(i) << Set Name(Char(clist[i]) || " °C"); //Error on this line
);
-Jarmo
txnelson
Super User

Re: Adding Formula Columns based on Column Name List

Here is a modification of your code using the Big Class data table as an example.

Names Default To Here( 1 );

Open( "$SAMPLE_DATA/big class.jmp" );
debug = 1;

Ptable = Current Data Table();

col list = Ptable << Get Column Names( String );

If( debug == 1,
	Print( col list )
);

// Columns are going to be added to the data table.  The For() clause
// will change the end point of the looping if ncols() is in the 
// termination value
ncolumns = N Cols( Ptable );

For( i = 1, i <= ncolumns, i++,
	If( Contains( col list[i], "eight" ), 
	// The formula equation needs to be fully parsed before applying it to
		// the columns definition
		Eval(
			Substitute(
					Expr(
						New Column( col List[i] || " (kPa)",
							Numeric,
							"Continuous",
							Format( "Best", 12 ),
							Set Selected,
							Formula(
								(((15 / (0.016 * Num( :age[1] ))) * Num( _col_ )) - 3.75) * 6.89476
							)
						)
					),
				Expr( _col_ ), parse(col list[i] )
			)
		)
	)
);
Jim