Formel erstellen: Mittelwert von Spalte A für Zeilen, bei denen Spalte B das Minimum in Gruppe Spalte C ist?Angenommen, ich verwende den Big Class-Datensatz und möchte eine neue Spalte für das Durchschnittsgewicht des kleinsten gleichaltrigen Schülers erstellen. Wie richte ich das ein?
Ich weiß, wie man das erste Bit macht (finde die Größe des kleinsten Schülers im gleichen Alter), das ist nur ein Col Mean mit einer byVariable:
Spalte Minimum( :Höhe, :Alter )
Aber ich weiß nicht, wie ich das durchschnittliche Gewicht dieser Untergruppe von Schülern nehmen soll, bei denen (A) das Alter dieses Schülers mit dem Alter des Schülers in dieser Reihe übereinstimmt, und (B) die Größe dieses Schülers entspricht der kürzesten Größe für Schüler ihres Alters.
DatentabelleBetreff: Formel erstellen: Mittelwert von Spalte A für Zeilen, bei denen Spalte B das Minimum in Gruppe Spalte C ist?Fantastisch, danke! Du lernst jeden Tag zwei neue Dinge 
Um Ihre Cars-Formeln in einer Spalte zusammenzufassen, sieht es so aus:
:Size[Col Max( If( :Wt == Col Max( :Wt, :Make ), Row(), . ), :Make )]
Betreff: Formel erstellen: Mittelwert von Spalte A für Zeilen, bei denen Spalte B das Minimum in Gruppe Spalte C ist?Ich habe eine Datentabelle mit etwas anderen Formeln angehängt und in mehr als eine aufgeteilt (meine früheren für Autos hatten möglicherweise einige Probleme aufgrund der Gruppierung für nicht maximale Gewichte). Auf diese Weise können Sie auch sehen, was passiert, wenn es Unentschieden gibt.
Mit :Size[idx] können Sie auf den Wert in der :Size-Spalte mit der angegebenen idx zugreifen, Sie können beispielsweise auch mit :Size[[1,2,3]] auf mehrere zugreifen (dies könnte ein wenig helfen Subskription von Datentabellen )
Führen Sie dies im Skriptfenster aus, sehen Sie sich das Protokoll an und vergleichen Sie es mit der Datentabelle:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Show(dt:name[1]);
Show(dt:name[5]);
Show(dt:name[10]);
Show(dt:name[[10, 11]]);
Show(dt:name[10::15]);Betreff: Formel erstellen: Mittelwert von Spalte A für Zeilen, bei denen Spalte B das Minimum in Gruppe Spalte C ist?Vielen Dank @jthi , das geht wunderbar!
Um sicherzugehen, dass ich es verstehe, sieht es so aus, als ob die If-Anweisung eine "virtuelle" Spalte erstellt, die alle Zeilen annulliert, in denen die Höhe nicht die Mindesthöhe für dieses Alter ist, und dann Col Mean verwendet, um diese "virtuelle" Spalte zu bearbeiten. Guter Trick!
Es scheint mir nicht, dass die Formel für das Beispiel "Autos" funktioniert - zum Beispiel gibt die Formel "pu" für Chevrolet zurück, obwohl der schwerste Chevy (der Suburban) "mpv" ist, und gibt "med" für Chrysler zurück obwohl der schwerste Chrysler (die Fifth Ave) ist "hev". Wie auch immer, für meine Anwendung haben Sie das Problem bereits mit Ihrer Formel von Big Class gelöst - aber nur aus Neugier und um mein JMP-Fu voranzutreiben, bin ich neugierig, mehr darüber zu erfahren, was in der endgültigen Formel vor sich geht. Was macht der Klammeroperator, zB ":Size[...]"?
Betreff: Formel erstellen: Mittelwert von Spalte A für Zeilen, bei denen Spalte B das Minimum in Gruppe Spalte C ist?Sie können dies mit einer Formel tun (Mittelwert der Mindestgewichte in der Altersgruppe):
Col Mean(If(:height == Col Min(:height, :age), :weight, .), :age)
Teilen Sie die Formel in zwei verschiedene Formeln auf, um sie etwas verständlicher zu machen:
Mindestgewichtswerte:
If(:height == Col Min(:height, :age),
:weight,
.
)
und dann Mittelwert dieses Wertes:
Col Mean(:MinWeightVal, :age)
Col Mean ignoriert fehlende Werte, daher sollte dies funktionieren
Bei Autos (nicht ganz sicher, wie die Daten aussehen sollen:
Max. Gewicht für Marke:
Col Max(:Wt, :Make)
Größe für Gewicht, wenn es nur eine Reihe sein soll:
If(:Wt == :Max Wt for Make,:Size,"")
Gleicher Wert für mehrere Zeilen, Sie können höchstwahrscheinlich einige Col-Funktionen von dort löschen, aber das war das Einfachste, was mir schnell eingefallen ist:
:Size[Col Max(Col Max(Row(), If(:Wt == Col Max(:Wt, :Make), 1, 0), :Make), :Make)]
Spucken Sie in mehrere verschiedene Formeln, um zu sehen, wie es funktioniert
Betreff: Formel erstellen: Mittelwert von Spalte A für Zeilen, bei denen Spalte B das Minimum in Gruppe Spalte C ist?Hi @markschwab ,
Wenn Sie es sich leisten können, die Tabelle zu sortieren, versuchen Sie Folgendes:
Names default to here (1);
// Open Data Table: Cars.jmp
dt = Open( "$SAMPLE_DATA/Cars.jmp" );
// Sort data table
dt << Sort( By( :Make, :Wt ), Replace Table, Order( Ascending, Descending ) );
// New column: Size of Max Wt for Make<BR />dt << New Column( "Size of Max Wt for Make",<BR />Character,<BR />"Nominal",<BR />Formula( If( Row() == 1, :Size, :Make == Lag( :Make ), Lag( :Size of Max Wt for Make ), :Make != Lag( :Make ), :Size ) )<BR />);<BR />
jetzt würde ich auch gerne die direkte formellösung ohne sortieren wissen.
Wenn Sie die Daten später umsortieren müssen, entfernen Sie einfach die Formel oder unterdrücken Sie die Auswertung.
Betreff: Formel erstellen: Mittelwert von Spalte A für Zeilen, bei denen Spalte B das Minimum in Gruppe Spalte C ist?Danke Ron. Ich denke, das könnte für mich funktionieren (obwohl es schön wäre, dies innerhalb desselben Datenblatts tun zu können.)
Um es hoffentlich einfacher zu machen, wäre es für meine tatsächliche Anwendung in Ordnung, eine Suche anstelle eines Mittelwerts zu verwenden - die Spalte, von der ich das Maximum nehmen werde, ist ein Zeitstempel, und wir können davon ausgehen, dass es eine eindeutige Zeile für jede Gruppe mit gibt aktuellster Zeitstempel.
Wenn ich also zum Beispiel den Cars-Datensatz verwende, wäre mein Problem:
Erstellen Sie eine Spalte „Size of Max Wt for Make“, die das Auto mit dem höchsten Wt unter allen Autos mit derselben Marke findet, und schlägt dann die Größe dieses Autos mit maximalem Wt nach.
Betreff: Formel erstellen: Mittelwert von Spalte A für Zeilen, bei denen Spalte B das Minimum in Gruppe Spalte C ist?Hi @markschwab ,
bis uns jemand die elegante Art der Verwendung einer Spaltenformel zeigt, können Sie Folgendes versuchen:
names default to here (1);
// Open Data Table: Big Class.jmp
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// New column: min height 0/1
dt<< New Column( "min height",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( If( :height == Col Min( :height, :age ), 1 ) )
);
// Data table summary
// → Data Table( "Big Class By (age, Min height)" )
dt2 = dt << Summary(
Group( :age, :Min height ),
Mean( :weight ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 )
);
// Delete selected rows
dt2 <<
Select Where( Is Missing( :Min height ) ) << Delete Rows;
// Update data tables
dt << Update(
With( dt2 ),
Match Columns( :age = :age ),
Replace Columns in Main Table(:"Mean(weight)"n )
);
Eine Formel wäre schöner, da sie sich auch automatisch aktualisiert.
lass es uns wissen, wenn es hilft.
Ron