SUMIF: Wie erhalte ich die bedingte Summe über Spalten hinweg?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich möchte die Summe von 10 Spalten in eine neue Spalte umrechnen, wobei ich nur die positiven Werte summieren möchte. Ebenso möchte ich eine weitere Spalte, die alle negativen Werte summiert. In Excel würde ich die Funktion SUMMEWENN verwenden: =SUMMEWENN(A1:J1;">0")
Wie kann ich etwas Ähnliches in JMP tun?
Anhand eines einfachen Beispiels in Excel (obwohl mein Datensatz offensichtlich größer ist) strebe ich Folgendes an:
| A | B | C | D | positive Summe | negative Summe |
| 1,00 | 2,00 | -7,00 | 5,00 | 8,00 | -7,00 |
| 4,00 | 64,00 | 55,90 | 5,20 | 129,10 | 0,00 |
| 86,10 | -34,44 | 5,60 | 7,21 | 98,91 | -34,44 |
| 6,00 | 8,00 | -96,00 | 6,00 | 20,00 | -96,00 |
| 1,00 | -8,00 | 5,00 | 0,64 | 6,64 | -8,00 |
Vielen Dank für deine Hilfe!
Yanne
Betreff: SUMIF: Wie erhalte ich die bedingte Summe über Spalten hinweg?Meine Güte, das ist wunderschön!
Betreff: SUMIF: Wie erhalte ich die bedingte Summe über Spalten hinweg?Ich mag so einfache und clevere Spaltenformeln wie die in Bradys Beitrag oben. Aber ja, sie skalieren oft furchtbar mit der Tischgröße.
Eine Alternative wäre, dass die Spaltenformel die aktuelle Zeile direkt abruft, ohne zuerst die gesamte Matrix in jeder Zeile abzurufen. Die folgende Formel ist ein Versuch dazu.
Es ist nicht so schnell wie Bradys JSL-Code oder Ians explizite Summe über Spalten, aber es ist viel schneller. und skaliert besser (mehr oder weniger linear). mit Tischgröße ), als eine Formel, auf die man sich verlässt dt< . Die Ausführung einer 10000x4-Tabelle dauert auf meinem Laptop etwa 0,2 Sekunden.
Das Beispiel zeigt auch eine alternative Methode zur Verallgemeinerung der Formel mithilfe einer lokalen Variablen, anstatt die Formeln dynamisch zu erstellen. Das kann ein sein Herausforderung . (In diesem Beispiel wird davon ausgegangen, dass die Formelspalten immer die letzten Spalten bleiben.)
//Beispieltabelle
dt = Neuer Tisch ( „Bedingte Summe über Spalten“ , Zeilen hinzufügen ( 10000 )) ;
Für ( ich = 1 , ich <= 4 , ich ++,
dt << Neue Spalte ( "X" , Numerisch , Formel ( Zufällig normal ( 0 , 1 )))
) ;
dt << Spalte löschen ( 1 ) ;
// Bedingte Summen über alle Spalten hinzufügen
dt << Neue Spalte ( „Positive Summe“ ,
Numerisch ,
Formel (
Lokal ({ ich = 0 , N = N Col ( Aktuelle Datentabelle ()) - 1 } ,
Summe ( Wiederholen ({ ich ++ ; Spalte ( ich )[] * ( Spalte ( ich )[] > 0 )} , N ))
)
)
) ;
dt << Neue Spalte ( „Negative Summe“ ,
Numerisch ,
Formel (
Lokal ({ ich = 0 , N = N Col ( Aktuelle Datentabelle ()) - 2 } ,
Summe ( Wiederholen ({ ich ++ ; Spalte ( ich )[] * ( Spalte ( ich )[] < 0 )} , N ))
)
)
) ;
Betreff: SUMIF: Wie erhalte ich die bedingte Summe über Spalten hinweg?Wie Brady bereits sagte: Wenn Sie auf den „Formel“-Aspekt verzichten können (der es Ihnen ermöglicht, neue Zeilen anzuhängen und automatisch Ergebnisse zu erhalten), lässt sich der Matrixansatz viel besser skalieren.
Wenn Sie die Formelspalten jedoch dynamisch erstellen möchten, würde das etwa so aussehen:
NamesDefaultToHere ( 1 ) ;
// Tabelle mit sechs Quellspalten
dt = Neuer Tisch ( „Summe der Spalten“ ,
Neue Spalte ( „Spalte 1“ , Numerisch , „Kontinuierlich“ , Format ( „Fester Dezember“ , 10 , 3 ) , Formel ( Zufällig normal ( 0 , 1 ) ) ) ,
Neue Spalte ( „Spalte 2“ , Numerisch , „Kontinuierlich“ , Format ( „Fester Dezember“ , 10 , 3 ) , Formel ( Zufällig normal ( 0 , 1 ) ) ) ,
Neue Spalte ( „Spalte 3“ , Numerisch , „Kontinuierlich“ , Format ( „Fester Dezember“ , 10 , 3 ) , Formel ( Zufällig normal ( 0 , 1 ) ) ) ,
Neue Spalte ( „Spalte 4“ , Numerisch , „Kontinuierlich“ , Format ( „Fester Dezember“ , 10 , 3 ) , Formel ( Zufällig normal ( 0 , 1 ) ) ) ,
Neue Spalte ( „Spalte 5“ , Numerisch , „Kontinuierlich“ , Format ( „Fester Dezember“ , 10 , 3 ) , Formel ( Zufällig normal ( 0 , 1 ) ) ) ,
Neue Spalte ( „Spalte 6“ , Numerisch , „Kontinuierlich“ , Format ( „Fester Dezember“ , 10 , 3 ) , Formel ( Zufällig normal ( 0 , 1 ) ) ) ,
Zeilen hinzufügen ( 10 )
) ;
// Liste der Spalten (kann eine beliebige Anzahl von Spalten sein!)
cListe = dt << getColumnNames ;
// Den Formelausdruck „negative Summe“ erstellen
colContribution = Ausdruck ( colTBD * Wenn ( colTBD < 0 , 1 , 0 )) ;
formArg = Ausdruck ( Hinzufügen ()) ;
Für ( C = 1 , C <= NItems ( cListe ) , C ++,
thisColContribution = NameExpr ( Ersatz ( NameExpr ( colContribution ) , Ausdruck ( colTBD ) , EvalExpr ( Als Spalte ( cListe [ C ])))) ;
Einfügen in ( formArg , thisColContribution ) ;
) ;
nsExpr = Ausdruck ( Formel ( fTBD )) ;
SubstituteInto ( nsExpr , Ausdruck ( fTBD ) , NameExpr ( formArg )) ;
// Print(nsExpr);
// Den Formelausdruck „positive Summe“ erstellen
colContribution = Ausdruck ( colTBD * Wenn ( colTBD >= 0 , 1 , 0 )) ;
formArg = Ausdruck ( Hinzufügen ()) ;
Für ( C = 1 , C <= NItems ( cListe ) , C ++,
thisColContribution = NameExpr ( Ersatz ( NameExpr ( colContribution ) , Ausdruck ( colTBD ) , EvalExpr ( Als Spalte ( cListe [ C ])))) ;
Einfügen in ( formArg , thisColContribution ) ;
) ;
psExpr = Ausdruck ( Formel ( fTBD )) ;
SubstituteInto ( psExpr , Ausdruck ( fTBD ) , NameExpr ( formArg )) ;
// Print(psExpr);
// Die beiden Formelspalten zu dt hinzufügen
nsCol = dt << Neue Spalte ( „Summe der Negative“ , Numerisch , Kontinuierlich , Format ( „Fester Dezember“ , 10 , 3 )) ;
makeFormula = Ausdruck ( Schicken ( nsCol )) ;
Einfügen in ( makeFormula , NameExpr ( nsExpr )) ;
makeFormula ;
psCol = dt << Neue Spalte ( „Summe des Positiven“ , Numerisch , Kontinuierlich , Format ( „Fester Dezember“ , 10 , 3 )) ;
makeFormula = Ausdruck ( Schicken ( psCol )) ;
Einfügen in ( makeFormula , NameExpr (P sExpr )) ;
makeFormula ;
Betreff: SUMIF: Wie erhalte ich die bedingte Summe über Spalten hinweg?Bradys Ergebnisse stimmen mit denen von Ian überein, aber Sie müssen diese Zeile ändern: M = ( dt << Holen Sie sich als Matrix )[ 0 , 1 :: 4 ] ;
dazu: M = ( dt << Holen Sie sich als Matrix )[ 0 , 1 :: 3 ] ;
Die von Ian erstellte Tabelle enthält nur drei Spalten, während Bradys Beispiel vier Spalten umfasst.
Betreff: SUMIF: Wie erhalte ich die bedingte Summe über Spalten hinweg?Lieber Ian und Brady,
Vielen Dank an beide für die freundliche und schnelle Hilfe!!! Ich habe beide Ansätze ausprobiert und irgendwie zwei unterschiedliche Ergebnisse erzielt :-(.
Beim manuellen Testen einiger Beispiele stellte ich fest, dass der Ansatz von Ian das richtige Ergebnis lieferte, während das Skript von Brady weitaus größere Summen lieferte. Keine Ahnung warum, und leider bin ich immer noch ein JMP-Anfänger und kann daher nicht herausfinden, was schief gelaufen ist. Aber da der Ansatz von Ian gut zu funktionieren schien, habe ich beschlossen, dabei zu bleiben (auch wenn die Formel für 10 Spalten ziemlich lang wird).
Also vielen Dank an beide für eure Hilfe!!!
(Und hoffen wir, dass JMP bis dahin über eine SUMIF-Funktion verfügen wird, wenn ich das jemals für 100 Spalten benötige
)
Prost,
Yanne
Betreff: SUMIF: Wie erhalte ich die bedingte Summe über Spalten hinweg?Wie Ian erwähnt, kann dies für viele Spalten unhandlich werden. Wenn Sie eine Formel nicht wirklich benötigen (d. h. die Quellspalten ändern sich nicht), können Sie dies schnell für alle Zeilen tun, indem Sie die folgende JSL mit der gewünschten aktuellen Datentabelle ausführen (der Code geht davon aus, dass sich die Zahlen in den Spalten 1–4 befinden). , gemäß den Indizes in Zeile 2 des Codes ... ändern Sie sie nach Bedarf, aber halten Sie sie zusammenhängend):
dt = Aktuelle Datentabelle () ;
M = ( dt << Holen Sie sich als Matrix )[ 0 , 1 :: 4 ] ;
dt << neue Kolumne ( „Positive Summe“ , << Werte einstellen ( vsum ( emul ( M > 0 , M ) ` ) ` )) ;
dt << neue Kolumne ( „Negative Summe“ , << Werte einstellen ( vsum ( emul ( M < 0 , M ) ` ) ` )) ;
Wenn Sie eine Formel benötigen, können Sie die folgende verwenden (am besten kopieren/fügen Sie sie in den Editor ein). Sie ist einfach, wird aber langsamer ausgeführt, wenn Ihre Tabelle sehr groß wird, da Sie die gesamte Matrix für jede Zeile erhalten. (Ändern Sie die Ungleichung für die negative Summe. Der
Operator ist die elementweise Multiplikation, die in der obigen Funktion emult() verwendet wird.)
dt = Aktuelle Datentabelle () ;
M = ( dt << getasmatrix )[ Reihe () , Index ( 1 , 4 )] ;
Summe ( ( M > 0 )
M ) ;
Der Nachteil dabei ist, dass es trotz seiner Leistungseinschränkungen hinsichtlich der Funktionen ziemlich kurz, einfach und leicht zu ändern ist, wenn Sie weitere Spalten hinzufügen. Ich würde es allerdings nur auf relativ kleinen Tischen verwenden. Andernfalls wäre es am besten, etwas zu verwenden, wie Ian es vorschlägt.
Vergleich der beiden Ansätze, die ich für eine 10.000 Zeilen mal 4 Spalten umfassende Tabelle mit Zufallszahlen beschreibe:
Skriptansatz: 0,002713 Sekunden
Formelansatz: 6,050183 Sekunden
Der Skriptansatz dauert bei einer Tabelle mit 10.000.000 Zeilen mal 4 Spalten nur 3 Sekunden. Ich habe nach einer Stunde aufgehört, den Formelansatz für eine Tabelle mit nur 1.000.000 Zeilen auszuführen. Es kommt wirklich darauf an, ob Sie den Formelteil benötigen oder bereit sind, ein Skript in der Tabelle zu speichern und es bei Bedarf einfach auszuführen. Wenn ja, erhalten Sie einen erheblichen Leistungsvorteil.
Prost,
Brady
Betreff: SUMIF: Wie erhalte ich die bedingte Summe über Spalten hinweg?Sie könnten einen Ansatz wie diesen in dieser Tabelle verwenden:
Neuer Tisch ( „Summe der Spalten“ ,
Zeilen hinzufügen ( 0 ) ,
Neue Spalte ( „Spalte 1“ ,
Numerisch ,
„Kontinuierlich“ ,
Format ( „Fester Dezember“ , 10 , 3 ) ,
Formel ( ZufälligNormal ( 0 , 1 ))
) ,
Neue Spalte ( „Spalte 2“ ,
Numerisch ,
„Kontinuierlich“ ,
Format ( „Fester Dezember“ , 10 , 3 ) ,
Formel ( ZufälligNormal ( 0 , 1 ))
) ,
Neue Spalte ( „Spalte 3“ ,
Numerisch ,
„Kontinuierlich“ ,
Format ( „Fester Dezember“ , 10 , 3 ) ,
Formel ( ZufälligNormal ( 0 , 1 ))
) ,
Neue Spalte ( „Summe des Positiven“ ,
Numerisch ,
„Kontinuierlich“ ,
Format ( „Fester Dezember“ , 10 , 3 ) ,
Formel (
: Spalte 1 * Wenn ( : Spalte 1 >= 0 , 1 , 0 ) + : Spalte 2 *
Wenn ( : Spalte 2 >= 0 , 1 , 0 ) + : Spalte 3 * Wenn ( : Spalte 3 >= 0 , 1 , 0 )
)
) ,
Neue Spalte ( „Summe der Negative“ ,
Numerisch ,
„Kontinuierlich“ ,
Format ( „Fester Dezember“ , 10 , 3 ) ,
Formel (
: Spalte 1 * Wenn ( : Spalte 1 < 0 , 1 , 0 ) + : Spalte 2 *
Wenn ( : Spalte 2 < 0 , 1 , 0 ) + : Spalte 3 * Wenn ( : Spalte 3 < 0 , 1 , 0 )
)
) ,
Zeilen hinzufügen ( 10 )
);
Bei vielen Spalten kann es einfacher sein, die erforderlichen Summenspalten programmgesteuert zu erstellen.
Betreff: SUMIF: Wie erhalte ich die bedingte Summe über Spalten hinweg?Hallo,
Dies ist ein sehr hilfreiches Skript für meine aktuelle Aufgabe.
Es funktioniert hervorragend für meine Spalten, in denen die Werte „0/0“ sind.
dt << Neue Spalte("Summe",Numerisch, Formel(
Local({i = 0, n = N Col(Current Data Table()) - 1},Sum(Repeat({i++ ; (Column(i)[] =="0/0")}, n))) ));
Wie kann ich es jedoch für Spalten bearbeiten, die „some_character“ enthalten, und ich muss diese Spalten zählen?
Ich habe eine Datentabelle mit der letzten Spalte „Summe“ angehängt, die eine benötigte Formel enthält.
Ich habe eine Big-Data-Tabelle und hätte gerne ein Skript zum Zählen von Spalten mit bestimmten Werten.
Danke schön,
Vizepräsident