Formel erstellen: Mittelwert von Spalte A für Zeilen, in denen Spalte B das Minimum in der Gruppe Spalte C ist?Angenommen, ich verwende den Datensatz „Big Class“ 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 den ersten Teil macht (die Größe des kleinsten gleichaltrigen Schülers ermitteln), das ist nur ein Col-Mittelwert mit einer byVariable:
Col Minimum( :height, :age )
Was ich aber nicht machen soll, ist, dann das Durchschnittsgewicht der Untergruppe von Schülern zu ermitteln, bei denen (A) das Alter dieses Schülers mit dem Alter des Schülers in dieser Zeile übereinstimmt und (B) die Größe dieses Schülers entspricht der kleinsten Körpergröße für Schüler ihres Alters.
Datenmischung und -bereinigungBetreff: Formel erstellen: Mittelwert von Spalte A für Zeilen, in denen Spalte B das Minimum in der Gruppe Spalte C ist?Fantastisch, danke! Man lernt jeden Tag zwei neue Dinge 
Um Ihre Autos-Formeln in einer Spalte zusammenzufassen, sieht das so aus:
:Size[Col Max( If( :Wt == Col Max( :Wt, :Make ), Row(), . ), :Make )]
Betreff: Formel erstellen: Mittelwert von Spalte A für Zeilen, in denen Spalte B das Minimum in der 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). So können Sie auch sehen, was passiert, wenn es Unentschieden gibt.
Mit :Size[idx] können Sie mit der angegebenen ID auf Werte in der Spalte :Size zugreifen. Sie können beispielsweise auch mit :Size[[1,2,3]] auf mehrere zugreifen (dies könnte ein wenig helfen). Abonnieren der Datentabelle )
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, in denen Spalte B das Minimum in der Gruppe Spalte C ist?Danke @jthi , das funktioniert wunderbar!
Um sicherzugehen, dass ich es verstehe: Es sieht so aus, als ob die If-Anweisung eine „virtuelle“ Spalte erstellt, die alle Zeilen aufhebt, deren Höhe nicht der Mindesthöhe für dieses Alter entspricht, und dann Col Mean verwendet, um diese „virtuelle“ Spalte zu bearbeiten. Guter Trick!
Mir scheint, dass die Formel für das Beispiel „Autos“ nicht funktioniert – zum Beispiel gibt die Formel „pu“ für Chevrolet zurück, obwohl der schwerste Chevy (der Suburban) „mpv“ ist, und gibt für Chrysler „med“ zurück, obwohl Der schwerste Chrysler (der Fifth Ave) ist „Hev“. Wie auch immer, für meine Bewerbung haben Sie das Problem bereits mit Ihrer Formel von Big Class gelöst – aber nur aus Neugier und um mein JMP-Fu zu fördern, bin ich neugierig, mehr darüber zu erfahren, was in der endgültigen Formel vor sich geht. Was macht der Klammeroperator, z. B. „:Size[...]“?
Betreff: Formel erstellen: Mittelwert von Spalte A für Zeilen, in denen Spalte B das Minimum in der Gruppe Spalte C ist?Sie können dies mit einer Formel tun (Mittelwert der Mindestgewichte in der Altersgruppe ermitteln):
Col Mean(If(:height == Col Min(:height, :age), :weight, .), :age)
Teilen Sie die Formel in zwei verschiedene Formeln auf, um sie leichter verständlich 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:
Maximales Gewicht für Marke:
Col Max(:Wt, :Make)
Größe für Gewicht, wenn Sie nur eine Reihe haben möchten:
If(:Wt == :Max Wt for Make,:Size,"")
Gleicher Wert für mehrere Zeilen, Sie können dort höchstwahrscheinlich einige Col-Funktionen löschen, aber das war die einfachste, die mir schnell eingefallen ist:
:Size[Col Max(Col Max(Row(), If(:Wt == Col Max(:Wt, :Make), 1, 0), :Make), :Make)]
Probieren Sie mehrere verschiedene Formeln aus, um zu sehen, wie es funktioniert
Betreff: Formel erstellen: Mittelwert von Spalte A für Zeilen, in denen Spalte B das Minimum in der Gruppe Spalte C ist?Hallo @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 />
Mittlerweile würde ich auch gerne die direkte Formellösung ohne Sortierung kennen.
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, in denen Spalte B das Minimum in der 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 eigentliche Anwendung in Ordnung, eine Suche anstelle eines Mittelwerts zu verwenden – die Spalte, von der ich das Maximum nehme, ist ein Zeitstempel, und wir können davon ausgehen, dass es für jede Gruppe eine eindeutige Zeile mit dem gibt aktuellster Zeitstempel.
Wenn ich beispielsweise 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 dann die Größe dieses Autos mit max. Wt nachschlägt.
Betreff: Formel erstellen: Mittelwert von Spalte A für Zeilen, in denen Spalte B das Minimum in der Gruppe Spalte C ist?Hallo @markschwab ,
Bis uns jemand die elegante Art und Weise zeigt, eine Spaltenformel zu verwenden, 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 auch automatisch aktualisiert wird.
Lassen Sie uns wissen, ob es hilft.
Ron