Col Min() und Col Max() für ZeichenspaltenIch interessiere mich für eine Funktion, die sich analog zu Col Min()/Col Max() verhält, einschließlich der Zulässigkeit von Gruppierungsvariablen; aber anstatt mit numerischen Spalten zu arbeiten, würde es mit Zeichenspalten arbeiten. Zum Beispiel:
- „Col Min Str( :Data, :Grouping)“ würde den alphabetisch ersten Eintrag von :Data zurückgeben, gruppiert nach :Grouping.
- „Col Max Str(:Data, :Grouping)“ würde den alphabetisch letzten Eintrag von :Data zurückgeben, gruppiert nach :Grouping.
Ideen?
Betreff: Col Min() und Col Max() für ZeichenspaltenBeide Antworten – danke – ich werde diese Lösung validieren und Ihnen antworten
Die Frage ist, ob es bei ~70.000 Zeilen funktionieren kann und wie lange?
Übrigens verwende ich eine sehr, sehr starke Maschine (RAM, SSD) auf der AWS-Instanz ...
Betreff: Col Min() und Col Max() für ZeichenspaltenHier ist eine weitere Lösung, die eine meiner Lieblingseigenschaften der Mathematik nutzt.
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>
Die Art und Weise, wie es funktioniert, basiert ausschließlich auf dem Rang.
Der Rang einer Liste gibt die Reihenfolge an, die erforderlich ist, um die ursprüngliche Liste zu unterteilen und eine geordnete Liste zu erhalten.
l = {"B", "D", "C", "A"};
r = rank(l);
// r = [4, 1, 3, 2]
// l[r] = {"A", "B", "C", "D"}
Der coole Gedanke ist, wenn Sie ein rank() eines rank() tanken, erhalten Sie die erforderliche Reihenfolge, um es wieder zur ursprünglichen Liste zurückzubringen, wenn Sie es zum Subskriptieren der sortierten Liste verwenden.
rr = rank(r);
// rr = [2, 4, 3, 1]
// l[r][rr] = {"B", "D", "C", "A"}
Hoffe, das funktioniert.
Betreff: Col Min() und Col Max() für ZeichenspaltenDie Funktion Col Max Str() ist generisch.Es funktioniert mit allen Zeichendaten, die ihm übergeben werden.Nachfolgend finden Sie die Verwendung in Ihrer Beispieldatentabelle
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" );
)
);Betreff: Col Min() und Col Max() für ZeichenspaltenJim,
Kann diese JSL allgemeiner sein?
zum Beispiel für die Tabelle unten
Versuchen Sie es mit Warum
Eine 1A
Ein 2C
Ein 2D
B 3B
B 2F
C 1S
C 1W
C 1R
Ich möchte das Maximum an „Warum“ pro Versuch erhalten, d. h
Ein 2D
B 3B
C 1W
Betreff: Col Min() und Col Max() für Zeichenspalten@John madden , Ihre Antwort hat mir den Einstieg in die Verwendung der Eval(Parse())-Methode erleichtert.Es ist eine leistungsstarke, aber verwirrende Methode.Also habe ich mir den Code noch einmal angesehen und festgestellt, dass durch die Verwendung einer As Column()-Funktion die gesamte Eval(Parse())-Sache entfernt werden kann
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" );
)
);Betreff: Col Min() und Col Max() für ZeichenspaltenDie Verwendung der Eval(Parse())-Methodik ermöglicht es einfach, eine oder mehrere JSL-Anweisungen in eine Literalzeichenfolge einzubauen und diese dann auszuführen.Ich verwende dies gelegentlich, wenn JMP eine Anweisung nicht richtig interpretiert.Ich habe die betreffende Aussage zunächst in dieser Form ausprobiert
rr = dt << get rows where( Column( dt, by ) == testBy );
JMP gefiel das nicht ... oder besser gesagt, JMP interpretierte es nicht so, wie ich es mir vorgestellt hatte.Die Anweisung funktionierte, wenn sie in einer expliziten Form vorlag
rr = dt << get rows where( :sex == "F" );
Durch die Generierung dieser bestimmten Zeile als Literalzeichenfolge und die Verwendung der kombinierten Funktion Eval(Parse()) wird daher die exakte explizite Form des gewünschten Codes generiert und dann ausgeführt
Eval(Parse(
"rr = dt << get rows where( :" || by || " == \!"" || testBy ||"\!" );"
)
);
Betreff: Col Min() und Col Max() für ZeichenspaltenJim,
Danke, das scheint genau richtig zu funktionieren. Es löst mein Problem.
Aber können Sie etwas dazu sagen? Wie Es klappt? Es sieht interessant aus und ich bin mit dem Stil nicht vertraut, insbesondere nicht mit der Funktion der Eval-Klausel (Parse …).
Prost, John
Betreff: Col Min() und Col Max() für ZeichenspaltenIch denke, das bietet, was Sie wollen
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" );
)
);