@powerpuff ,
C'è un modo fantastico da cui ho imparato @Craige_Hales per trovare elementi comuni tra le liste.
<BR />List1 = {"Final Output","Final Name","Final Place","Final Animal","Final Thing"};
List2 = {"Output","Name","Place","Animal","Thing","Final Output","Final Name","Final Place",
"Final Animal","Final Thing"};
AA1 = Associative Array(List1);
AA2 = Associative Array(List2);
Intersection = AA1 ;
Intersection << Intersect(AA2);
print("common (intersection) items:",Intersection<<GETKEYS></GETKEYS>( https://community.jmp.com/t5/Discussions/Quick-way-to-compare-two-lists-and-identify-the-uncommon/td-p/5811)
Grazie Uday @uday_guntupalli
Un'ultima domanda: se ho 2 liste
a1 = {Uscita finale, Nome finale, Posto finale, Animale finale, Cosa finale} e
ColNames = {Output, Name, Place, Animal, Thing, Final Output, Final Name, Final Place, Final Animal, Final Thing}
Come posso confrontare e trovare se i valori nell'elenco corrispondono? Anche la lunghezza di questi elenchi è disuguale e non riesco a trovare un modo per farlo girare.
Qualcosa di simile a:
if(ColNames[i] == a1[],
show(ColNames[i]);
);
Grazie mille.
@powerpuff ,
Supponiamo che la tua tabella assomigli a quella mostrata di seguito.

È possibile utilizzare il seguente pezzo di codice per aggiornare i nomi delle colonne aggiungendo "Final" o qualsiasi altra parola come mostrato di seguito. Eri sulla strada giusta, l'unica cosa che dovevi aggiungere era ottenere un riferimento per la colonna e aggiungere un comando set name
dt = current data table();
ColNames = dt << Get Column Names("String");
for(i = 1, i <= N Items(ColNames), i++,
Col = Column(dt,i); // get reference for column
Col << Set Name("Final " || ColNames[i]);
);
Ciao, Superchicca!
Ecco un paio di funzioni di manipolazione degli elenchi dal capitolo 5 della seconda edizione di JSL Companion:
// JSL Companion: Applications of the JMP Scripting Language
// Title: 5_Extra_CustomListFunctions.jsl
// Version: Windows JMP® 13.2.1
// Purpose: Provides examples of writing user functions.
/*Notes:
These functions are provided for learning as well as utility.
For any script, where you would like to use these functions,
use and Include("path\5_Extra_CustomListFunctions.jsl");
The script will define 2 functions. After each is a comment
block /*: Usage & Test examples ... --- end Test*/. Remove
The comment block and run the examples one line at a time. Open
the embedded log or have the log window visible to see
the results.
Motivation:
As seen in Chapter 5, a numeric function on a single layer
list of numbers, or a vector, or a matrix, will return the
same object with the function applied to each item. For example,
xx = Sqrt({1,2,3,4,9}); //xx = {1, 1.4142135623731, 1.73205080756888, 2, 3}
We have suggested that the same apply to String functions (that operate
on a single item) on a list of text. What we would like is
xx = Substr({"Quaker", "Minnesota", "Nebraska"}, 1,1); would return
xx = {"Q", "M", "N"}. However, currently most JMP String functions do not
allow list arguments.
Functions defined here, are:
- LFunc( mylist, expr); where expression is like expr(Substr(x,1,1)).
- Like(SourceStr,SearchStr); both arguments are text/strings. The second
argument uses % and * as wild cards. Note this a simplified Regex.
LFunc can save writing for-loops, Like save looking up the REGEX syntax.
*/
//------LFunc-------------------------------------------------------------------
::Lfunc = Function( {xList, fExpr/*ex. Expr(Contains(x,"h"))*/},
{x = {}, i = 1, errCode = 0, errStr = "\!NError bad argument", newExpr},
If( !Is List( xList ),
errCode = 1
);
If(
Type( Name Expr( fExpr ) ) == "Name",
//if Name then JMP does not recognize the function
tmp = Trim( Char( Name Expr( fExpr ) ) );
//extract the function and check if it is contained in the global namespace, if not error!
If( Namespace( "global" ) << Contains( Word( 1, tmp, ":(" ) ) == 0,
errCode = errCode + 2
);,
Type( Name Expr( fExpr ) ) != "Expression", errCode = errCode + 2
);
//catches typos, returns Name if not a valid function
//catches typos, returns Name if not a valid function
If( !Is Expr( Name Expr( fExpr ) ),
errCode = errCode + 2
); //catches syntax
If(
!errCode,
For( i = 1, i <= N Items( xList ), i++,
newExpr = Substitute( Name Expr( fExpr ), Expr( x ), xList[i] );
Insert Into( x, Try( newExpr, Empty() ) );
),
errCode == 1, Write( errStr || "(1) not a list \!N" ),
errCode == 2, Write( errStr || "(2) not a valid expression \!N" ),
errCode == 3, Write( errStr || "s (1) is not a list and (2) is not a valid expression \!N" )
);
x//return x
;
); //End Lfunc
//------------------------------------------------------------------------------
//Usage & Test ...remove the slash asterisk and run in segments, results are in the log
//------------------------------------------------------------------------------
myList={"john", "harry", "huh","ah ha", "xyx", , "a", "h", 7, [1,7]};
/* returns a list of numeric values, one value for each item in the list
n =>1st location of h, 0 => does not contain, Empty() => the item is not
a valid argument for that expression.
*/
zz = Lfunc(myList,Expr(Contains(x,"h")));
show(zz);
//-----------------------------------------------------------------------------------------
/* returns a list of how many words are in each string
[] -> no occurrences
Empty() => the expression is not valid for that item.
*/
zz = Lfunc(mylist, expr(nitems(words(x))));
show(zz);
//-----------------------------------------------------------------------------------------
/* This specified function requires numeric arguments
Empty() => the expression is not valid for that item.
A numeric function applied to a matrix returns a matrix
of the results applied on each element in the matrix.
Only the last 2 items are valid arguments for Log()
*/
zz = Lfunc(mylist, expr(log(x)));
show(zz);
//----------------Error Checking---------------------------------------------------------------
zz = Lfunc("oh johhny", Expr(Contains(x,"h")) ); //not a list
show(zz);
zz = Lfunc({"oh johhny"}, Expr(Contians(x,"h")) ); //type not a valid expr due to typo
show(zz);
zz = Lfunc("oh johhny", Expr(Contians(x,"h")) ); //not a list and not a valid expr
show(zz);
//----- end test */
//====================================================================================
//------Like-------------------------------------------------------------------
//--- New function that converts the SQL "like" format to a regular expression
// Uses % wildcard, ex A%B%C must start with A, and end with C and B in the middle
// %A%B%C% and pattern with A, B and C in that order
// We think this covers most cases where reg expr special characters
// need an escape, a forward slash, ex. ) needs \) . needs \. etc.
// If you find others, add to mList.
::Like = Function( {SourceStr, SearchStr},
{patStr = "^", i, ret, mList = {"(", ")", "$", "[", "]", ".", "*", "^"}},
Substitute Into( SearchStr, "%%", "-|~" ); //cheat , will not handle -|~
For( i = 1, i <= N Items( mList ), i++,
Substitute Into( SearchStr, mList[i], "\" || mList[i] )
);
Substitute Into( SearchStr, "%", ".*" );
Substitute Into( SearchStr, "-|~", "%" ); //replace
patStr ||= SearchStr;
ret = Try( Regex Match( SourceStr, patStr )[1], "" );
//show(patStr, ret,SourceStr);
If( Length( ret ) > 0 & ret == SourceStr,
SourceStr,
""
);
); //end Like
/* Usage & Test ... remove the slash asterisk and run in segments, results are in the log
//------------------------------------------------------------------------------
zz=Like("JSL COMPANION VERSION 2", "%SL%MP%ION%");
show(zz);
zz=Like("JSL COMPANION VERSION 2", "SL%MP%ION%"); //will not match
show(zz);
zz=Like("JSL COMPANION VERSION 2", "JSL%"); //starts with
show(zz);
zz=Like("JSL COMPANION VERSION 2", "jsl%"); //starts with not case sensitive
show(zz);
zz=Like("EDGE INFILM", "%fil%"); //ends with not case sensitive
show(zz);
zz=Like("EDGE INFILM", "%fil"); //will not match
show(zz);
//when the SourceStr has the %, the SearchStr, must use %% for the single %
//function needs at least one character before the occurence of "%" and 1 after.
zz=Like("This is a % test and a * test.", "%a %%%d%*%"); //contains
show(zz);
//===============Apply Like to each item in a list using Lfunc
//create xxList a test case
xxList = {"CAD.DFM_COUNT (GROUP=C1;LOC=CENTER)(MODULE=*)(X-BAR)", "CAD.DFM_COUNT (GROUP=C2;LOC=CENTER)(MODULE=*)(X-BAR)",
"CAD.DFM_COUNT (GROUP=C3;LOC=CENTER)(MODULE=*)(X-BAR)", "CAD.DFM_COUNT (GROUP=C1;LOC=EDGE)(MODULE=*)(X-BAR)",
"CAD.DFM_COUNT (GROUP=C2;LOC=EDGE)(MODULE=*)(X-BAR)", "CAD.DFM_COUNT (GROUP=C3;LOC=EDGE)(MODULE=*)(X-BAR)",
"SUM.CAD.DFM_%GROUP (GROUP=C1;LOC=CENTER)(MODULE=*)(X-BAR)", "SUM.CAD.DFM_%GROUP (GROUP=C2;LOC=CENTER)(MODULE=*)(X-BAR)",
"SUM.CAD.DFM_%GROUP (GROUP=C3;LOC=CENTER)(MODULE=*)(X-BAR)", "SUM.CAD.DFM_%GROUP (GROUP=C1;LOC=EDGE)(MODULE=*)(X-BAR)",
"SUM.CAD.DFM_%GROUP (GROUP=C2;LOC=EDGE)(MODULE=*)(X-BAR)", "SUM.CAD.DFM_%GROUP (GROUP=C3;LOC=EDGE)(MODULE=*)(X-BAR)"};
//will report the length of all that items that match pattern
zz= Lfunc(xxList, expr( length(::Like(x,"%C1%")) ) );
show(zz);
//will find the list index for each match using a variable ref
sstr = "%C1%";
zz= Loc(Matrix(Lfunc(xxList, expr( length(::Like(x,sstr)) ) ) )>0);
show(zz, if(nrow(zz)>0,xxList[zz],{} ));
//will find the list index for each item that contains a %GROUP
sstr = "%_%%GROUP%";
zz= Loc(Matrix(Lfunc(xxList, expr( length(::Like(x,sstr)) ) ) )>0);
show(zz, if(nrow(zz)>0,xxList[zz],{} ));
----- end test */Prova a eseguire alcuni dei casi di test commentati per avere un'idea di come funzionano e se soddisferanno le tue esigenze.
Buona fortuna!
@powerpuff ,
Un umile suggerimento che vorrei fare è fornire esempi dei tuoi dati nella tabella dei dati o negli screenshot, in modo che sia più facile per le persone capire esattamente cosa stai chiedendo. Presumo che tu abbia 2 liste che assomigliano a quelle qui sotto:
list1 = {"Final Name 1", "Final Name 2", "Final Name 3"};
list2 = {"Place","Animal","Name","Thing"};
MatchPos = {};
for(i = 1, i <= N Items(list1), i++,
If(!IsMissing(Regex(Char(list1[i]),"Name")),
Insert Into(MatchPos,i);
);
);
Show(MatchPos);Se quanto sopra è vero, puoi facilmente cercare e trovare la corrispondenza con il tuo termine di interesse in questo caso "Nome" come mostrato sopra. Tuttavia, non ho potuto seguire il resto della domanda intorno alle righe. Spero che questo aiuti, se non investite gentilmente del tempo per rendere la vostra domanda il più strutturata e chiara possibile.