<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic JSL to generate matching column difference and average in Discussions</title>
    <link>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/676517#M86312</link>
    <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;I am hoping to get some help on the following:&lt;/P&gt;&lt;P&gt;Attached JMP file with the following table.&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pkl_jmp_0-1694450384560.png" style="width: 746px;"&gt;&lt;img src="https://community.jmp.com/t5/image/serverpage/image-id/56478iA993A9308E8F9346/image-dimensions/746x155?v=v2" width="746" height="155" role="button" title="pkl_jmp_0-1694450384560.png" alt="pkl_jmp_0-1694450384560.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;My typical/starting data set contain:&lt;/P&gt;&lt;P&gt;1. an identifier "Type"&lt;/P&gt;&lt;P&gt;2. a set of unknown number of columns with same prefix and various number suffix, e.g. A num1, A num2, A num3...&lt;/P&gt;&lt;P&gt;3. a second set of the same number of columns as in #2 above, with same prefix and matching suffix as in #2, e.g. B num1, B num2, B num3...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;May I get some help to write a jsl script to generate the columns to pair up the set A and set B column to calculate:&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp;Formula( (:B 1.0 - :B 0.5) / (:A 1.0 - :A 0.5) ) ),&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;&lt;/SPAN&gt;Formula( (:B 1.3 - :B 0.5) / (:A 1.3 - :A 0.5) ) ),&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;&lt;/SPAN&gt;Formula( (:B 1.3 - :B 1.0) / (:A 1.3 - :A 1.0) ) ),&lt;/P&gt;&lt;P&gt;Then, generate an Average column ("B/A Avg") to take the mean of all columns created. Noted that the generate columns above may be any number. It could be 3, or 2, or 6...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;At the end of the day, I am mostly interested to get the final column of "B/A Avg", the interim columns are optional if that simplify the script. &amp;nbsp;&lt;/P&gt;&lt;P&gt;Please let me know if I may clarify anything in my questions. Thanks a lot in advance.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Mon, 11 Sep 2023 16:56:33 GMT</pubDate>
    <dc:creator>pkl_jmp</dc:creator>
    <dc:date>2023-09-11T16:56:33Z</dc:date>
    <item>
      <title>JSL to generate matching column difference and average</title>
      <link>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/676517#M86312</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;I am hoping to get some help on the following:&lt;/P&gt;&lt;P&gt;Attached JMP file with the following table.&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="pkl_jmp_0-1694450384560.png" style="width: 746px;"&gt;&lt;img src="https://community.jmp.com/t5/image/serverpage/image-id/56478iA993A9308E8F9346/image-dimensions/746x155?v=v2" width="746" height="155" role="button" title="pkl_jmp_0-1694450384560.png" alt="pkl_jmp_0-1694450384560.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;My typical/starting data set contain:&lt;/P&gt;&lt;P&gt;1. an identifier "Type"&lt;/P&gt;&lt;P&gt;2. a set of unknown number of columns with same prefix and various number suffix, e.g. A num1, A num2, A num3...&lt;/P&gt;&lt;P&gt;3. a second set of the same number of columns as in #2 above, with same prefix and matching suffix as in #2, e.g. B num1, B num2, B num3...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;May I get some help to write a jsl script to generate the columns to pair up the set A and set B column to calculate:&lt;/P&gt;&lt;P&gt;&amp;nbsp; &amp;nbsp;Formula( (:B 1.0 - :B 0.5) / (:A 1.0 - :A 0.5) ) ),&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;&lt;/SPAN&gt;Formula( (:B 1.3 - :B 0.5) / (:A 1.3 - :A 0.5) ) ),&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;&lt;/SPAN&gt;Formula( (:B 1.3 - :B 1.0) / (:A 1.3 - :A 1.0) ) ),&lt;/P&gt;&lt;P&gt;Then, generate an Average column ("B/A Avg") to take the mean of all columns created. Noted that the generate columns above may be any number. It could be 3, or 2, or 6...&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;At the end of the day, I am mostly interested to get the final column of "B/A Avg", the interim columns are optional if that simplify the script. &amp;nbsp;&lt;/P&gt;&lt;P&gt;Please let me know if I may clarify anything in my questions. Thanks a lot in advance.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 11 Sep 2023 16:56:33 GMT</pubDate>
      <guid>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/676517#M86312</guid>
      <dc:creator>pkl_jmp</dc:creator>
      <dc:date>2023-09-11T16:56:33Z</dc:date>
    </item>
    <item>
      <title>Re: JSL to generate matching column difference and average</title>
      <link>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/676534#M86316</link>
      <description>&lt;P&gt;What does determine the pairs of columns used for calculation?&lt;/P&gt;</description>
      <pubDate>Mon, 11 Sep 2023 17:34:24 GMT</pubDate>
      <guid>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/676534#M86316</guid>
      <dc:creator>jthi</dc:creator>
      <dc:date>2023-09-11T17:34:24Z</dc:date>
    </item>
    <item>
      <title>Re: JSL to generate matching column difference and average</title>
      <link>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/676537#M86317</link>
      <description>&lt;P&gt;Having the same suffix (number). For example, 0.5 to 0.5, 1.0 to 1.0, 1.3 to 1.3, etc...&lt;/P&gt;</description>
      <pubDate>Mon, 11 Sep 2023 17:36:55 GMT</pubDate>
      <guid>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/676537#M86317</guid>
      <dc:creator>pkl_jmp</dc:creator>
      <dc:date>2023-09-11T17:36:55Z</dc:date>
    </item>
    <item>
      <title>Re: JSL to generate matching column difference and average</title>
      <link>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/676558#M86319</link>
      <description>&lt;P&gt;If I have columns A0.5, A1.0, A1.3, B0.5, B1.0 and B1.3, how would I know I need exactly (B1.0-B0.5)/(A1.0-A0.5), (B1.3-B0.5)/(A1.3-A0.5) and (B1.3-B1.0)/(A1.3-A1.0) columns?&lt;/P&gt;</description>
      <pubDate>Mon, 11 Sep 2023 18:11:46 GMT</pubDate>
      <guid>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/676558#M86319</guid>
      <dc:creator>jthi</dc:creator>
      <dc:date>2023-09-11T18:11:46Z</dc:date>
    </item>
    <item>
      <title>Re: JSL to generate matching column difference and average</title>
      <link>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/676562#M86321</link>
      <description>&lt;P&gt;Thank you very much for patiently working with me and apologize for not being 100% clear of the intention.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;For the equation, it will always be: ( B num1 - B num2 ) / ( A num1 - A num2 )&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Since we will always get the same set of suffix between the A-group and B-group, my goal is to get all possible combinations among the A-group, which can be limited to only higher value suffix - lower value suffix.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Alternatively, if it simplify the script, we may find the difference between any pair, say including both&amp;nbsp;&lt;SPAN&gt;(B1.0-B0.5)/(A1.0-A0.5) and&amp;nbsp;(B0.5-B1.0)/(A0.5-A1.0). This way, the average will still be the same as higher-lower only.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 11 Sep 2023 18:40:20 GMT</pubDate>
      <guid>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/676562#M86321</guid>
      <dc:creator>pkl_jmp</dc:creator>
      <dc:date>2023-09-11T18:40:20Z</dc:date>
    </item>
    <item>
      <title>Re: JSL to generate matching column difference and average</title>
      <link>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/676685#M86329</link>
      <description>&lt;P&gt;Here is my method that creates the new columns you want.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-jsl"&gt;names default to here(1);
dt=current data table();

// Set Prefixes
pre1 = "A";
pre2 = "B";

// Get all levels using Pre1 columns to find the levels
theColumnNames = dt &amp;lt;&amp;lt; get column names( string, continuous );
levels = {};
For Each( {col, i}, theColumnNames,
	if(word(1,col," ")==pre1,
		insert into(levels,trim(substr(col,length(pre1)+1)))
	)
);

// Create new columns.  
// This is accomplished by creating a character string that is the JSL statement that
// is required to create the new column and it's formula
meanColsList = {};
For( i = 2, i &amp;lt;= N Items( levels ), i++,
	For( k = 1, k &amp;lt;= i - 1, k++,
		Eval(
			Parse(
				"dt &amp;lt;&amp;lt; New Column( \!"" || pre2 || "/" || pre1 || " " || levels[i] || "-" || levels[k] || 
				"\!", formula( (:" || pre2 || " " || levels[i] || " - :" || pre2 || " " || levels[k] || ") 
				/ (:" || pre1 || " " || levels[i] || " - :" || pre1 || " " || levels[k] || ") ) );"
			)
		);
	insert into( meanColsList, ":\!"" || pre2 || "/" || pre1 || " " || levels[i] || "-" || levels[k] || "\!"n");
	);	
);

Eval(
	Parse(
		"dt &amp;lt;&amp;lt; New Column( \!"" || pre2 || "/" || pre1 || " Avg\!", formula( Sum(" || 
		Concat Items( meanColsList, "," ) || ") / Number(" ||
		Concat Items( meanColsList, "," ) || ")));"
	)
);&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 12 Sep 2023 06:45:30 GMT</pubDate>
      <guid>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/676685#M86329</guid>
      <dc:creator>txnelson</dc:creator>
      <dc:date>2023-09-12T06:45:30Z</dc:date>
    </item>
    <item>
      <title>Re: JSL to generate matching column difference and average</title>
      <link>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/676741#M86331</link>
      <description>&lt;P&gt;This can also give some ideas&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-jsl"&gt;Names Default To Here(1);

dt = Open("$DOWNLOADS/Question - Auto Col Diff and Avg.jmp");
dt &amp;lt;&amp;lt; Clear Column Selection &amp;lt;&amp;lt; Clear Select;
col_list = dt &amp;lt;&amp;lt; Get Column Names("String");

// Get column types
col_rgx_pattern = "^(.?) (\d+.\d+)";
aa = Associative Array();
For Each({col_name}, col_list,
	rgx_result = Regex(col_name, col_rgx_pattern);
	If(!IsMissing(rgx_result),
		parts = Words(rgx_result);
		If(N Items(parts) == 2,
			If(!Contains(aa, parts[1]),
				aa[parts[1]] = {};
			);
			Insert Into(aa[parts[1]], parts[2]);
		);
	);
);

// Check that all different columns have same number parts (ignored in this case)


// Create combinations
ordered_num_parts = Reverse(Sort List(aa[aa &amp;lt;&amp;lt; first])); // sort from largest to smallest, works in this simple case
pairs = {};
For(i = 1, i &amp;lt;= N Items(ordered_num_parts) - 1, i++,
	For(j = i + 1, j &amp;lt;= N Items(ordered_num_parts), j++,
		cur_pair = Eval List({ordered_num_parts[i], ordered_num_parts[j]});
		Insert Into(pairs, Eval List({cur_pair}));
	);
);


// Create new columns
avg_expr = Expr(Mean());
For Each({pair}, pairs,
	f_expr = Substitute(
		Expr(
			(_last_numerator_ - _first_numerator_) / (_last_denominator_ - _first_denominator_)
		),
		Expr(_last_numerator_), Name Expr(AsColumn(dt, "B " || pair[1])),
		Expr(_first_numerator_), Name Expr(AsColumn(dt, "B " || pair[2])),
		Expr(_last_denominator_), Name Expr(AsColumn(dt, "A " || pair[1])),
		Expr(_first_denominator_), Name Expr(AsColumn(dt, "A " || pair[2]))
	);
	Eval(EvalExpr(new_col = dt &amp;lt;&amp;lt; New Column("B/A " || pair[1] || "-" || pair[2], Numeric, Continuous, Formula(
		Expr(Name Expr(f_expr))
	))));
	Insert Into(avg_expr, Name Expr(AsColumn((new_col &amp;lt;&amp;lt; get name))));
);

Eval(EvalExpr(
	dt &amp;lt;&amp;lt; New Column("B/A AVG", Numeric, Continuous, Formula(
		Expr(Name Expr(avg_expr))
	));
));&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 12 Sep 2023 09:43:50 GMT</pubDate>
      <guid>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/676741#M86331</guid>
      <dc:creator>jthi</dc:creator>
      <dc:date>2023-09-12T09:43:50Z</dc:date>
    </item>
    <item>
      <title>Re: JSL to generate matching column difference and average</title>
      <link>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/677056#M86346</link>
      <description>&lt;P&gt;Thank you very much Jarmo. Learned so many new ways of scripting from this example. Appreciate your help.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 12 Sep 2023 19:12:49 GMT</pubDate>
      <guid>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/677056#M86346</guid>
      <dc:creator>pkl_jmp</dc:creator>
      <dc:date>2023-09-12T19:12:49Z</dc:date>
    </item>
    <item>
      <title>Re: JSL to generate matching column difference and average</title>
      <link>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/677057#M86347</link>
      <description>&lt;P&gt;Thank you very much, Jim, for your help. Very straight forward and easy to understand. Appreciate it!&lt;/P&gt;</description>
      <pubDate>Tue, 12 Sep 2023 19:14:15 GMT</pubDate>
      <guid>https://community.jmp.com/t5/Discussions/JSL-to-generate-matching-column-difference-and-average/m-p/677057#M86347</guid>
      <dc:creator>pkl_jmp</dc:creator>
      <dc:date>2023-09-12T19:14:15Z</dc:date>
    </item>
  </channel>
</rss>

