cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
  • Sign-in to the JMP Community will be unavailable intermittently Dec. 6-7 due to a system update. Thank you for your understanding!
  • We’re retiring the File Exchange at the end of this year. The JMP Marketplace is now your destination for add-ins and extensions.
  • JMP 19 is here! Learn more about the new features.

Discussions

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

Check if wafer from an input string is contained within a data table

I have an input string from below: 

For( i = 1, i <= N Rows( dtWaferIDList ), i++,
	tempi = Column( dtWaferIDList, 1 )[i];
	InputString = If( i == 1, "'", "" ) || InputString || tempi || If( i < N Rows( dtWaferIDList ), "','", "'" );
);

And a table1 that I pull from a database. I would like to check to see if (in the Wafer column of table 1) all the wafers from the input string are contained in that column. 

- if all wafers have data: display message = "data for all wafers available".

- if not: display message = "no data available".

 

Thank you!

1 ACCEPTED SOLUTION

Accepted Solutions
jthi
Super User

Re: Check if wafer from an input string is contained within a data table

Use debug Show()s and small data set to test where you go wrong (open log window from View / Log).

 

Maybe this will help you forward:

Names Default To Here(1);
dt1 = Open("$SAMPLE_DATA/Big Class.jmp");
dt1 << Select Rows([1,2,3]);
dt2 = dt1 << Subset(selected rows);
dt1 << clear select;

dt1_uniq = Associative Array(dt1:name);
dt2_uniq = Associative Array(dt2:name);
dt1_copy = dt1_uniq;
dt2_copy = dt2_uniq;
dt1_copy << Remove(dt2_copy);

Show(concat items(dt1_uniq << get keys, ", "));
Show(concat items(dt2_uniq << get keys, ", "));
Show(concat items(dt1_copy << get keys, ", "));
Show(N Items(dt1_uniq), N Items(dt2_uniq), N Items(dt1_copy));
-Jarmo

View solution in original post

9 REPLIES 9
jthi
Super User

Re: Check if wafer from an input string is contained within a data table

You could most likely use Associative Array for this comparison Applications for Associative Arrays . Check out the part  Compare Columns in Two Different Data Tables

-Jarmo
txnelson
Super User

Re: Check if wafer from an input string is contained within a data table

@jthi has pointed you in the right direction.  Your proposed approach is using a very long literal string.  I suggest that you either use associative arrays, or a JMP list.  

Below is a simple script that opens a data table that contains wafers.  It then creates a data table that has a random set of wafers.  Finally it checks to see if the random set contains all wafers from the first data table.

names default to here(1);
// Open Data Table: semiconductor capability.jmp
// → Data Table( "semiconductor capability" )
dt = Open( "$SAMPLE_DATA/semiconductor capability.jmp" );

unique wafers = associative array(dt:Wafer);

// Create a random wafer table and see if it contains all wafers
dtRand = new table("Random",
	add rows(60),
	new column("Rand Wafer", set each value(random integer(1,24)));
);

random wafers = associative array(dtRand:Rand wafer);
Random wafers << Intersect( unique wafers );

if(n items(Random wafers) == n items( unique wafers),
   msg = "data for all wafers available",
   msg = "no data available"
 );

new window("Message", <<modal,
	text box(msg)
);
Jim
saneal
Level III

Re: Check if wafer from an input string is contained within a data table

Hello Nelson,

 

I appreciate the help! I am a bit new to JMP still and haven't used Associative Arrays at all yet. I have read up on it on the scripting guide and index; but am still having some confusion. Here is where I am at in my code: (directly after opening the table WaferRgDt from a database)

unique wafers = Associative Array( WaferRgDt:Wafer );
given wafers = Associative Array( dtWaferIDList:WaferList );
intersection = unique wafers; intersection << Intersect( given wafers); //intersection between arrays

//uncommmon2 represents wafers that have no data associated with it.
uncommon2 = given wafers; uncommon2 <<remove(intersection); show(uncommon2 << Get Keys);

if(n items( given wafers ) == n items( unique wafers ),
   msg = "Data for all wafers is available.",
   //else
   msg = Write("\!N#Data is unavailable for the following wafers:", uncommon2 << Get Keys)
 );

new window("Message", <<modal,
	text box(msg)
);

When I run this I get an empty messagebox with a period... so something seems wrong still. Wondering if its a logic issue or syntax. I have had some trouble finding how to write keys in a messagebox if its even possible to do. Hope that was clear enough. Thanks again!

 

saneal
Level III

Re: Check if wafer from an input string is contained within a data table

Also used this discussion post to aid in writing the code aboveRe: Quick way to compare two lists (uncommon elements)? 

jthi
Super User

Re: Check if wafer from an input string is contained within a data table

To convert a list of strings into a string you can use Concat Items()

Names Default To Here(1);
aa = Associative Array({"bun",
	"shoe",
	"tree",
	"door"}
);

uniqKeys = aa << get keys;
Show(uniqKeys);
Show(Concat Items(uniqKeys, ", "));

 

-Jarmo
saneal
Level III

Re: Check if wafer from an input string is contained within a data table

@jthi 

I don't see how that solves my particular issue. When I run your script, nothing happens. I need the keys from the associative array to be visible to the user and displayed in a msg box.

unique wafers = Associative Array( WaferRgDt:Wafer );
given wafers = Associative Array( dtWaferIDList:WaferList );
intersection = unique wafers; intersection << Intersect( given wafers); //intersection between arrays

//uncommon represents wafers that have no data associated with it.
uncommon = given wafers; uncommon2 <<remove(intersection); show(uncommon << Get Keys);

if(n items( given wafers ) == n items( unique wafers ),
   msg = "Data for all wafers is available.",
   //else
   msg = Show(Concat Items("\!N#Data is unavailable for the following wafers:", uncommon << Get Keys))
 );

new window("Message", <<modal,
	text box(msg)
);
jthi
Super User

Re: Check if wafer from an input string is contained within a data table

Use debug Show()s and small data set to test where you go wrong (open log window from View / Log).

 

Maybe this will help you forward:

Names Default To Here(1);
dt1 = Open("$SAMPLE_DATA/Big Class.jmp");
dt1 << Select Rows([1,2,3]);
dt2 = dt1 << Subset(selected rows);
dt1 << clear select;

dt1_uniq = Associative Array(dt1:name);
dt2_uniq = Associative Array(dt2:name);
dt1_copy = dt1_uniq;
dt2_copy = dt2_uniq;
dt1_copy << Remove(dt2_copy);

Show(concat items(dt1_uniq << get keys, ", "));
Show(concat items(dt2_uniq << get keys, ", "));
Show(concat items(dt1_copy << get keys, ", "));
Show(N Items(dt1_uniq), N Items(dt2_uniq), N Items(dt1_copy));
-Jarmo
txnelson
Super User

Re: Check if wafer from an input string is contained within a data table

Your msg value is being specified incorrectly.  The below will work

msg = "\!N#Data is unavailable for the following wafers:" || Char( uncommon2 << Get Keys );
Jim
saneal
Level III

Re: Check if wafer from an input string is contained within a data table

Thank you both! Looks to be working now. I appreciate it!

Recommended Articles