cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Have your say in shaping JMP's future by participating in the new JMP Wish List Prioritization Survey
Choose Language Hide Translation Bar
midori555
Level II

creating formula using existing column names

Names Default To Here( 1 );
dt = Current Data Table();
numcol=dt << Get Column Names(Numeric);
charcol=dt << Get Column Names( Character);


For( k = 1, k <= N Items( numcol ), k++,
colname=column(numcol[k]) <<Get Name;

dt << New Column( "site"||numcol[k],
formula(If(
	:ID == "item5", (:Column( dt, colname)* 0.5) / 20,
	:ID == "item8", (:Column( dt, colname) * 0.8) / 20,
	:Column( dt, colname)
)
)
);
);

Hi JMP users,

I have a data table that I need to do some conversions on numeric columns based on predefined criteria. 

I'm getting error "Expression does not fit available column types at row 1 in access or evaluation of 'Bad Argument' ".

Any idea on how to resolve this? Appreciated!

1 ACCEPTED SOLUTION

Accepted Solutions
txnelson
Super User

Re: creating formula using existing column names

You have 2 issues going on here.

  1. When a formula is presented to a new column, it is not processed before being added as the formula.  Therefore, when you are specifying
    :Column(dt, colname)
    JMP does not change it to the first numeric column name, then the second, etc.  The JSL author must use code that will expand the reference into the complete/ finished JSL statement before passing it to the Format element
  2. The column names in your data table, i.e. 1, 2, 3, 4 etc. will cause problems in JMP interpreting them, unless you specifically indicate they are to be interpreted as column names.  Therefore, you need to use the :"column name"n structure

Below is a reworking of your code that produces the new columns you want

Names Default To Here( 1 );
dt = Current Data Table();
numcol = dt << Get Column Names( Numeric );
charcol = dt << Get Column Names( Character );


For( k = 1, k <= N Items( numcol ), k++,
	colname = Column( numcol[k] ) << Get Name;

	Eval(
		Substitute(
				Expr(
					dt << New Column( "site" || numcol[k],
						formula(
							If(
								:ID == "item5", (__colname__ * 0.5) / 20,
								:ID == "item8", (__colname__ * 0.8) / 20,
								__colname__ 
							)
						)
					)
				),
			Expr( __colname__ ), Parse( ":\!"" || colname || "\!"n")
		)
	);
);
Jim

View solution in original post

2 REPLIES 2
txnelson
Super User

Re: creating formula using existing column names

You have 2 issues going on here.

  1. When a formula is presented to a new column, it is not processed before being added as the formula.  Therefore, when you are specifying
    :Column(dt, colname)
    JMP does not change it to the first numeric column name, then the second, etc.  The JSL author must use code that will expand the reference into the complete/ finished JSL statement before passing it to the Format element
  2. The column names in your data table, i.e. 1, 2, 3, 4 etc. will cause problems in JMP interpreting them, unless you specifically indicate they are to be interpreted as column names.  Therefore, you need to use the :"column name"n structure

Below is a reworking of your code that produces the new columns you want

Names Default To Here( 1 );
dt = Current Data Table();
numcol = dt << Get Column Names( Numeric );
charcol = dt << Get Column Names( Character );


For( k = 1, k <= N Items( numcol ), k++,
	colname = Column( numcol[k] ) << Get Name;

	Eval(
		Substitute(
				Expr(
					dt << New Column( "site" || numcol[k],
						formula(
							If(
								:ID == "item5", (__colname__ * 0.5) / 20,
								:ID == "item8", (__colname__ * 0.8) / 20,
								__colname__ 
							)
						)
					)
				),
			Expr( __colname__ ), Parse( ":\!"" || colname || "\!"n")
		)
	);
);
Jim
midori555
Level II

Re: creating formula using existing column names

Thanks Jim it works!