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
doraemengs
Level III

getting column name with specific cut-off values

Hi,

I try to count and get specific column names from these data examples (my real data contained 180 columns and 20000 rows)

I want to select the column that cut-off > 1000 

 

No.A*1:01A*2:01B*9:02C*10:01DR*56:01DP*07_GGet name
110.6709520.2315000.190.5640.89B*9:02, C*10:01
2000009.56 
39040.3345.3345.9999.934510.5A*1:01
434.4456645700A*2:01
59190.2135673456678990880A*1:01,A*2:01,B*9:02,C*10:01,DR*56:01
6000000 
...       

I try the previous script like this 

Names Default To Here( 1 );

// Create a sample data table
dt = New Table( "Example",
	Add Rows( 2 ),
	New Column( "A*1:01", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
	New Column( "A*2:01", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
	New Column( "B*9:02", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
	New Column( "C*10:01", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
	New Column( "DR*56:01", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 50000] ) ),
//get wanted columns. Assumes that IMC columns start from column 1 and all IMC columns are one after another
colNames = dt << Get Column Names("String");
For(i = N Items(colNames), i > 3000 , i--,
);

//new column with IMC with value 1
dt << New Column( "Ag", Character, 
	<< Set Each Value(
		rowValues = dt[Row(), 0][1::N Items(colNames)]; //get values of row as matrix
		colIndex = Contains(rowValues, 1); //get index of
		If(colIndex > 0, //handle 
			colNames[colIndex], //get column name with the index
			""; //when no 1 found use ""
		);
	);
);

Could you please to correct my scripts, Thank you!

In addition, can I use matrix because of I need to generate the "new column" of 180 column. 

 

Best, 

1 ACCEPTED SOLUTION

Accepted Solutions
jthi
Super User

Re: getting column name with specific cut-off values

You will have to open your table, fix the columns and then run the part where new column is created

Names Default To Here(1);

dt = Open("$DOWNLOADS/Examples_get column name_by cutoff.jmp", invisible);

colnames = Remove(dt << Get Column Names("String"), 1); // drop No column

// Fix data and modeling types
For Each({colname}, colnames,
	Column(dt, colname) << Data Type("Numeric") << Modeling Type("Continuous");
);


newcol = dt << New Column("getname", Character, Nominal, Formula(
	valid_idx = Loc(dt[Row(), colnames] > 1000);
	If(N Items(valid_idx) > 0,
		Concat Items(colnames[valid_idx], ", ")
	,
		""
	);
));
dt << run formulas;
newcol << delete formula;

I strongly suggest you check out Scripting Guide from JMP Help

-Jarmo

View solution in original post

7 REPLIES 7
txnelson
Super User

Re: getting column name with specific cut-off values

Here is how I would handle this

txnelson_0-1718733620444.png

names default to here(1);
dt = New Table( "Example",
	Add Rows( 6 ),
	New Column( "A*1:01",
		Numeric,
		"Continuous",
		Format( "Best", 12 ),
		Set Values(
			[10.67, 0, 9040.2999999999993, 34.399999999999999, 9190.2000000000007, 0
			]
		)
	),
	New Column( "A*2:01",
		Numeric,
		"Continuous",
		Format( "Best", 12 ),
		Set Values( [0, 0, 345.30000000000001, 4566, 13567, 0] )
	),
	New Column( "B*9:02",
		Numeric,
		"Continuous",
		Format( "Best", 12 ),
		Set Values( [9520.2299999999996, 0, 345.89999999999998, 45, 3456, 0] )
	),
	New Column( "C*10:01",
		Numeric,
		"Continuous",
		Format( "Best", 12 ),
		Set Values( [15000.1, 0, 999.89999999999998, 7, 6789, 0] )
	),
	New Column( "DR*56:01",
		Numeric,
		"Continuous",
		Format( "Best", 12 ),
		Set Values( [90.560000000000002, 0, 345, 0, 9088, 0] )
	),
	New Column( "DP*07_G",
		Numeric,
		"Continuous",
		Format( "Best", 12 ),
		Set Values( [40.890000000000001, 9.5600000000000005, 10.5, 0, 0, 0] )
	)
);

dt << New Column( "Get Name",character);

colNames = dt << get column names( continuous,string );

For Each Row(
	theList = {};
	For Each( {col, i}, colNames,
		If( As Column( col ) > 3000,
			Insert Into( theList, col )
		)
	);
	:Get Name = Concat Items( theList, "," );
);

Jim
doraemengs
Level III

Re: getting column name with specific cut-off values

Hi Jim,

 

Thank you for your help. However, I have 180 columns and 20000 rows in difference words and I cannot put all of them as following scripts. Could you please provide me with more suggestions?

 

Thank you

jthi
Super User

Re: getting column name with specific cut-off values

This might be fast enough

Names Default To Here(1);

// Create a sample data table
dt = New Table("Example",
	Add Rows(20000),
	invisible
);

colcount = 200;
For(i = 1, i <= colcount, i++,
	newcol = dt << New Column(Char(i), Numeric, Continuous, Formula(
		Random Normal() * 1000
	));
	dt << run formulas;
	newcol << delete formula;
);

start = Tick Seconds();
colnames = dt << Get Column Names("String");
newcol = dt << New Column("getname", Character, Nominal, Formula(
	valid_idx = Loc(dt[Row(), colnames] > 1000);
	If(N Items(valid_idx) > 0,
		Concat Items(colnames[valid_idx], ", ")
	,
		""
	);
));
dt << run formulas;
newcol << delete formula;

wait(0);
end = Tick Seconds();
show(end - start);
-Jarmo
doraemengs
Level III

Re: getting column name with specific cut-off values

Hi Jarmo,

 

Thank you so much. But the result is "end - start = 0.0333333333255723;" That's not the new table. could you please provide more solutions? please show me the following data table on JMP. 

 

Thank you

jthi
Super User

Re: getting column name with specific cut-off values

My script creates new column "getname" with the values

jthi_0-1718737059176.png

 

With your data, after you fix your columns to numeric (and drop No column)

jthi_1-1718737144803.png

 

-Jarmo
doraemengs
Level III

Re: getting column name with specific cut-off values

Hi Jarmo,

 

Thank you for your help but to be honest as in the following attachment, I cannot run the script as you did. when I checked the script (command + 1) shown below. Thank you for your help.

dt = New Table("Example",
	Add Rows(20000),
	invisible
);

colcount = 200;
For(i = 1, i <= colcount, i++,
	newcol = dt << New Column(Char(i), Numeric, Continuous, Formula(
		Random Normal() * 1000
	));
	dt << run formulas;
	newcol << delete formula;
);

start = Tick Seconds();
colnames = dt << Get Column Names("String");
newcol = dt << New Column("getname", Character, Nominal, Formula(
	valid_idx = Loc(dt[Row(), colnames] > 1000);
	If(N Items(valid_idx) > 0,
		Concat Items(colnames[valid_idx], ", ")
	,
		""
	);
));
dt << run formulas;
newcol << delete formula;

wait(0);
end = Tick Seconds();
show(end - start);
/*:

end - start = 0.683333333348855;

 

jthi
Super User

Re: getting column name with specific cut-off values

You will have to open your table, fix the columns and then run the part where new column is created

Names Default To Here(1);

dt = Open("$DOWNLOADS/Examples_get column name_by cutoff.jmp", invisible);

colnames = Remove(dt << Get Column Names("String"), 1); // drop No column

// Fix data and modeling types
For Each({colname}, colnames,
	Column(dt, colname) << Data Type("Numeric") << Modeling Type("Continuous");
);


newcol = dt << New Column("getname", Character, Nominal, Formula(
	valid_idx = Loc(dt[Row(), colnames] > 1000);
	If(N Items(valid_idx) > 0,
		Concat Items(colnames[valid_idx], ", ")
	,
		""
	);
));
dt << run formulas;
newcol << delete formula;

I strongly suggest you check out Scripting Guide from JMP Help

-Jarmo