Associa colonne per nomeHo qualcosa su cui lavorare qui
Risolto: Traccia automaticamente le colonne associate - JMP User Community
ma sono abbastanza sicuro che sia inutilmente macchinoso. Ho nomi di colonne che finiscono con la lettera H (High) che devo associare a nomi di colonne che altrimenti corrispondono ma finiscono con la lettera L (Low). Posso creare un array associativo con i nomi di colonna da cui è stato rimosso il carattere finale. Sono indeciso su cosa fare dopo?
names default to here(1);
dt = Current Data Table();
colList = dt << get column names( string );
for each({col,index}, colList,
//colList[index] = substr(col,1,3)
colList[index] = Left(col,Length(col)-1)
);
grps = associative array(colList)<<GET keys=""></GET>
<P>Ad esempio, VT123ABCH deve essere confrontato con VT123ABCL e così via.</P><LINGO-LABS id="lingo-labs-848773" slang="en-US" mode="CREATE"><LINGO-LABEL>Automazione e scripting</LINGO-LABEL></LINGO-LABS>Re: Associa colonne per nomeLe coppie esistono sempre? Ci sono altre colonne nella tabella oltre a queste coppie? Sono in un ordine specifico?
Modificare:
Può essere molto probabilmente migliorato a seconda del caso d'uso reale
names default to here(1);
dt = New Table("",
New Column("VT123ABCH"),
New Column("VT123ABCL")
);
collist = dt << get column names(string);
hcols = Filter Each({colname}, colList,
Ends With(colname, "H");
);
aa = Associative Array();
For Each({hcolname}, hcols,
lcolname = Left(hcolname, Length(hcolname) - 1) || "L";
If(dt << Has Column(lcolname),
aa[hcolname] = lcolname
);
);
Show(aa);Re: Associa colonne per nomeEcco un esempio di come potresti fare ciò che vuoi

Names Default To Here( 1 );
dt =
// Open Data Table: semiconductor capability.jmp
// → Data Table( "semiconductor capability" )
Open( "$SAMPLE_DATA/semiconductor capability.jmp" );
colNames = dt << get column names( continuous, string );
For Each( {col}, colNames,
If( Ends With( col, "1" ) & Contains( colNames, Substr( col, 1, Length( col ) - 1 ) || "2" ),
Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
Variables( X( As Column( col ) ), Y( As Column( Substr( col, 1, Length( col ) - 1 ) || "2" ) ) ),
Elements( Points( X, Y, Legend( 3 ) ), Smoother( X, Y, Legend( 4 ) ) )
);
)
);Re: Associa colonne per nomeJarmo
Sembra molto più ordinato di quello che avevo, tuttavia, ricevo questo errore.
"L'oggetto 'Tabella dati' non riconosce il messaggio 'Ha colonna'"
Re: Associa colonne per nomeCiò è stato aggiunto in JMP18

Puoi cambiarlo in Contains() e dovrebbe funzionare correttamente la maggior parte delle volte
Contains(collist, lcolname)
Re: Associa colonne per nomeJarmo
Questo è vicino, ma ho notato che hcolname è vuoto, mentre lcolname ha un valore. Devo stabilire hcolname come oggetto o elenco?
Re: Associa colonne per nomehcols dovrebbe contenere un elenco di tutte le colonne che terminano con "H". Questo viene poi utilizzato in For Each e each if gli elementi saranno utilizzati uno per uno come hcolname. Puoi aggiungere stampe di debug per capire cosa sta succedendo. Inoltre, questo non è sicuramente l'unico modo per farlo, potresti ad esempio facilmente in un singolo ciclo.
Re: Associa colonne per nome
Jarmo
Questo mi avvicina un po' di più, ma lcolname non viene popolato fino al valore finale.
For Each({hcolname, index}, hcols,
{lcolname, index}, hcols = Left(hcolname, Length(hcolname) - 1) || "L";
If(dt << Contains(collist, lcolname),
aa[hcolname] = lcolname
);
);Re: Associa colonne per nomePer me sembra funzionare bene. Puoi modificare la tabella di esempio in capacità semiconduttore e controllare alcuni numeri alla fine
Names default to here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
collist = dt << get column names(string);
hcols = Filter Each({colname}, colList,
Ends With(colname, "1");
);
aa = Associative Array();
For Each({hcolname}, hcols,
lcolname = Left(hcolname, Length(hcolname) - 1) || "2";
If(dt << Has Column(lcolname),
aa[hcolname] = lcolname
);
);
Show(aa);
aa = ["ESM1" => "ESM2", "FST1" => "FST2", "INM1" => "INM2", "IVP1" => "IVP2", "NPN1" => "NPN2", "PBA1" => "PBA2", "PLG1" => "PLG2", "PLY1" => "PLY2", "PNP1" => "PNP2", "RES1" => "RES2", "RSP1" => "RSP2", "SIT1" => "SIT2", "VDP1" => "VDP2", "VPM1" => "VPM2"];
Ma potresti anche seguire una strada leggermente diversa con un po' più di opzioni di configurazione
Names Default To Here(1);
endchar1 = "1";
endchar2 = "2";
rgx_endchar1 = Eval Insert("(.+?)^endchar1^$");
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
collist = dt << get column names(string);
aa = Associative Array();
For Each({colname}, collist,
col_ptrn = Regex(colname, rgx_endchar1, "\1");
If(!IsMissing(col_ptrn), // ends with H
If(Contains(collist, col_ptrn || endchar2),
aa[col_ptrn || endchar1] = col_ptrn || endchar2;
);
);
);
show(aa);
Entrambi mi restituiscono gli stessi risultati
Re: Associa colonne per nomeIo sono
Ottima sceneggiatura e molto più semplice. L'ho modificata un po' per avere tutte le trame in una finestra "Compilation".
Names Default To Here( 1 );
dt = Current Data Table();
colNames = dt << get column names( continuous, string );
New Window( "Compilation",
For Each( {col}, colNames,
If(
Starts With( col, "VT" ) & Contains(
colNames,
Substr( col, 1, Length( col ) - 1 ) || "H"
),
Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
Variables(
X( As Column( col ) ),
Y( As Column( Substr( col, 1, Length( col ) - 1 ) || "L" ) )
),
Wrap( :LOT ),
Elements(
Points( X, Y, Legend( 1 ) ),
Line Of Fit( X, Y, Legend( 3 ) )
)
)
)
)
);Re: Associa colonne per nomeJarmo
Stranezza di JMP. Il primo non funziona, il secondo sì, JMP 17 forse? Grazie per avermi sopportato.