Come calcolare una corrispondenza con JSL?Ciao a tutti!
In Excel, le funzioni "=offset(,match(,,)-1,match(,,)-1,,)" possono essere utilizzate per calcolare, ma la velocità è lenta quando i dati sono grandi.
Come farlo con JSL?Grazie!
Re: Come calcolare una corrispondenza con JSL?Sì, Excel è conveniente per utilizzare le funzioni del foglio di lavoro entro 10.000 righe.
Oltre 10.000 righe sono abituato a farlo con un dizionario VBA. Ma i dizionari oltre 100.000 sono lenti.
Ora, utilizzando questo metodo di JMP, oltre 10 milioni di linee sono anche veloci. Grazie!Re: Come calcolare una corrispondenza con JSL?Non vedo il vantaggio per la comunità degli utenti JMP della dichiarazione nella tua ultima risposta,
" È anche veloce usare un dizionario in Excel……Set d = CreateObject("Scripting.Dictionary") "
Sembra che un tale commento sarebbe più appropriato nel forum di discussione di Excel
Re: Come calcolare una corrispondenza con JSL?Grazie mille per il tuo aiuto.
È anche veloce usare un dizionario in Excel……Set d = CreateObject("Scripting.Dictionary")
ma più di un milione di righe dovranno essere fatte in modo diverso.Re: Come calcolare una corrispondenza con JSL?Ecco alcuni modi per impilare con un numero variabile di colonne, se stai usando la corrispondenza in Excel oggi, probabilmente uno dei primi due metodi funzionerà:
//If the column positions do not change
d3_1 = d1 << Stack(
columns( Concat( [2 3], 4::10 )),
Source Label Column( "year" ),
Stacked Data Column( "data" ),
Drop all other columns( 1 ),
Keep( :state )
);
//If you want all columns
d1_clean = ( d1 << Subset( All rows, columns( 1::10 ) ) );
d3_2 = d1_clean << Stack(
columns( 2:: ncol(d1_clean) ),
Source Label Column( "year" ),
Stacked Data Column( "data" ),
Drop all other columns( 1 ),
Keep( :state )
);
//If the column names are in a specific format
// - get column names
cn = d1 << Get Column Names( string );
// - Find which columns match a format
// (jmp does have some patter matching tools but I like regex, check out regexr.com)
matches = repeat(0, N Items(cn));
for(c=1, c<= N Items(cn), c++, if(!is missing(Regex(cn[c], "^\d+$")), matches[c] = 1));
// - Stack
d3_3 = d1 << Stack(
columns( loc(matches) ),
Source Label Column( "year" ),
Stacked Data Column( "data" ),
Drop all other columns( 1 ),
Keep( :state )
);
Re: Come calcolare una corrispondenza con JSL?Se queste colonne sono molte, ad esempio più di 1000……Diciamo che è una data.
in che modo queste colonne implementano l'impostazione della tabella d3 sotto forma di un ciclo variabile. Grazie!

Re: Come calcolare una corrispondenza con JSL?buon lavoro! Grazie!Re: Come calcolare una corrispondenza con JSL?Poiché sei preoccupato per la velocità con tabelle di grandi dimensioni, potresti creare una "tabella di ricerca" in un formato lungo in modo che ci sia una riga per valore e quindi utilizzare con Join o Aggiorna per eseguire la ricerca.Ecco come potrebbe apparire:
Names default to here( 1 );
d1 = Open( "$SAMPLE_DATA/Presidential Elections.jmp" );
d2 = New Table( "offset",
Add Rows( 8 ),
New Column( "State",
Character,
"Nominal",
Set Values(
{"Wyoming", "Montana", "Montana", "Alaska", "Wisconsin", "Nebraska", "Nevada", "Montana"}
)
),
New Column( "year",
Character,
"Ordinal",
Set Values( {"1988", "1988", "1988", "1992", "2000", "1992", "2004", "1980"} )
),
New Column( "data",
Numeric,
"Continuous",
Format( "Fixed Dec", 12, 1 ))
);
//Move data to a long format
d3 = d1 << Stack(
columns(
:Name( "1980" ),
:Name( "1984" ),
:Name( "1988" ),
:Name( "1992" ),
:Name( "1996" ),
:Name( "2000" ),
:Name( "2004" ),
:Name( "2008" ),
:Name( "2012" )
),
Source Label Column( "year" ),
Stacked Data Column( "data" )
);
d3 << Set Name( "Long format" );
d3:year << Set Modeling Type("Ordinal");
//'Lookup' the values:
d2 << Update( with(d3), Match Columns( :state=:state, :year=:year ), Add Columns from Update table( None ));
d3 << Close window;
Re: Come calcolare una corrispondenza con JSL?Calcolare il valore dei "dati" nella tabella "offset" in base ai dati nella tabella "Elezioni presidenziali".
Grazie!Re: Come calcolare una corrispondenza con JSL?d1 = Open("$SAMPLE_DATA/Presidential Elections.jmp");
d2 = Nuova tabella ("offset",
Aggiungi righe( 8 ),
Nuova colonna ("Stato",
Carattere,
"Nominale",
Imposta valori(
{"Wyoming", "Montana", "Montana", "Alaska", "Wisconsin", "Nebraska", "Nevada", "Montana"}
)
),
Nuova colonna( "anno",
Carattere,
"Nominale",
Imposta valori( {"1988", "1988", "1988", "1992", "2000", "1992", "2004", "1980"} )
),
Nuova colonna("dati", Carattere, "Nominale", ),
);