Col Min() e Col Max() per le colonne CarattereSono interessato a una funzione che si comporti in modo analogo a come fa Col Min()/Col Max(), inclusa la possibilità di raggruppare le variabili; ma invece di operare su colonne numeriche, opererebbe su colonne di caratteri. Per esempio:
- "Col Min Str( :Data, :Grouping)" restituirebbe la prima voce in ordine alfabetico da :Data, raggruppata per :Grouping.
- "Col Max Str(:Data, :Grouping)" restituirebbe l'ultima voce in ordine alfabetico da :Data, raggruppata per :Grouping.
Idee?
Re: Col Min() e Col Max() per le colonne di caratteriEntrambe le risposte - grazie - convaliderò questa soluzione e ti risponderò
La domanda è se può funzionare su ~ 70.000 righe e per quanto tempo?
A proposito, sto usando una macchina molto, molto potente (RAM, SSD) su un'istanza AWS ...
Re: Col Min() e Col Max() per le colonne di caratteriEcco un'altra soluzione che utilizza una delle mie proprietà matematiche preferite.
Names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp");
l = :name << Get Values;
r = rank(l);
rr = rank(r);
dt << new Column("Order", <<SET values=""></SET>
Il modo in cui funziona è tutto basato sul grado.
Il grado di un elenco darà l'ordine richiesto per sottoimpostare l'elenco originale per ottenere un elenco ordinato.
l = {"B", "D", "C", "A"};
r = rank(l);
// r = [4, 1, 3, 2]
// l[r] = {"A", "B", "C", "D"}
La cosa interessante è che se si tanka un rank() di un rank() ti darà l'ordine richiesto per riportarlo all'elenco originale quando viene utilizzato per pedice l'elenco ordinato.
rr = rank(r);
// rr = [2, 4, 3, 1]
// l[r][rr] = {"B", "D", "C", "A"}
Spero che funzioni.
Re: Col Min() e Col Max() per le colonne di caratteriLa funzione Col Max Str() è generica.Funziona su qualsiasi dato di carattere gli venga passato.Di seguito è riportato l'utilizzo nella tabella dei dati di esempio
names default to here(1);
dt=New Table( "Untitled 2",
Add Rows( 8 ),
New Column( "Try",
Character,
"Nominal",
Set Values( {"A", "A", "A", "B", "B", "C", "C", "C"} )
),
New Column( "Why",
Character,
"Nominal",
Set Values( {"1A", "2C", "2D", "3B", "2F", "1S", "1W", "1R"} )
)
);
dt << New Column( "Max Why by Try",
Character,
Nominal,
Formula(
Col Max Str = Function( {data, by},
dt = Current Data Table();
testBy = Column( dt, by )[Row()];
rr = dt << get rows where( as column(dt, by) == testBy );
myList = As List( Column( dt, data )[rr] );
myList = Sort List( myList );
myList[N Items( myList )];
);
result = Col Max Str( "Why", "try" );
)
);Re: Col Min() e Col Max() per le colonne di caratteriJim,
Può essere questo jsl più generico?
ad esempio per la tabella seguente
Prova perché
A 1A
A 2C
Un 2D
B 3B
B 2F
C 1S
C 1W
C 1R
Voglio ottenere il massimo di "Perché" per Try ie
Un 2D
B 3B
C 1W
Re: Col Min() e Col Max() per le colonne di caratteri@john_madden , la tua risposta mi ha fatto iniziare a usare il metodo Eval(Parse()).È una metodologia potente ma confusa.Quindi ho dato un'occhiata al codice ancora una volta e usando una funzione As Column() l'intera cosa Eval(Parse()) può essere rimossa
names default to here(1);
dt=open("$SAMPLE_DATA/big class.jmp");
dt << New Column( "Max Name by Sex",
Character,
Nominal,
Formula(
Col Max Str = Function( {data, by},
dt = Current Data Table();
testBy = Column( dt, by )[Row()];
rr = dt << get rows where( as column(dt, by) == testBy );
myList = As List( Column( dt, data )[rr] );
myList = Sort List( myList );
myList[N Items( myList )];
);
result = Col Max Str( "Name", "Sex" );
)
);Re: Col Min() e Col Max() per le colonne di caratteriL'uso della metodologia Eval(Parse()), consente semplicemente di creare una o più istruzioni JSL in una stringa letterale e quindi eseguirle.Lo uso in occasioni in cui JMP non interpreta correttamente un'affermazione.Inizialmente ho provato la dichiarazione in questione in questa forma
rr = dt << get rows where( Column( dt, by ) == testBy );
A JMP non piaceva... o meglio, JMP non lo interpretava come pensavo.La dichiarazione ha funzionato se era in una forma esplicita
rr = dt << get rows where( :sex == "F" );
Pertanto, generando quella riga specifica come stringa letterale e utilizzando la funzione combinata Eval(Parse()), genera l'esatta forma esplicita del codice che voglio e quindi lo esegue
Eval(Parse(
"rr = dt << get rows where( :" || by || " == \!"" || testBy ||"\!" );"
)
);
Re: Col Min() e Col Max() per le colonne di caratteriJim,
Grazie, questo sembra funzionare bene. Risolve il mio problema.
Ma puoi dire qualcosa in merito come funziona? Sembra interessante e non ho familiarità con lo stile, in particolare cosa sta facendo la clausola Eval ( Parse ... ).
Saluti, Giovanni
Re: Col Min() e Col Max() per le colonne di caratteriPenso che questo fornisca quello che vuoi
names default to here(1);
dt=open("$SAMPLE_DATA/big class.jmp");
dt << New Column( "Max Name by Sex",
Character,
Nominal,
Formula(
Col Max Str = Function( {data, by},
dt = Current Data Table();
testBy = Column( dt, by )[Row()];
Eval(
Parse(
"rr = dt << get rows where( :" || by || " == \!"" || testBy ||
"\!" );"
)
);
myList = As List( Column( dt, data )[rr] );
myList = Sort List( myList );
myList[N Items( myList )];
);
result = Col Max Str( "Name", "Sex" );
)
);
dt << New Column( "Min Name by Sex",
Character,
"Nominal",
Formula(
Col Min Str = Function( {data, by},
dt = Current Data Table();
testBy = Column( dt, by )[Row()];
Eval(
Parse(
"rr = dt << get rows where( :" || by || " == \!"" || testBy ||
"\!" );"
)
);
myList = As List( Column( dt, data )[rr] );
myList = Sort List( myList );
myList[1];
);
result = Col Min Str( "Name", "Sex" );
)
);