Ich habe eine CSV-Datei, die temporäre Werte speichert. Ich muss den Gruppendurchschnitt für bestimmte Stichproben gemäß den folgenden Schritten ermitteln:
1. Stellen Sie alle temporären Werte kleiner als 25 auf Null ein, dh Spalte post_process
2. Die Spalte group_avg wird abgeleitet, indem Zeilen mit mehr als oder gleich 4 aufeinanderfolgenden Nullen ignoriert werden. Anschließend wird der Durchschnitt der Probengruppe wie unten gezeigt berechnet
3. Die Spalte final_average ist das Ergebnis der Spalte group_avg
Wie können wir diesen Prozess mit jsl skripten?
Anhängen der CSV-Datei
Das Endergebnis ist endgültig _Durchschnitt wie in der folgenden Tabelle:

Hier ist ein Skript, das Ihre Datentabelle nur mit der TEMP-Spalte erstellt. Anschließend werden die verbleibenden Spalten erstellt und mit Formeln gefüllt.
Names Default To Here( 1 );
dt = New Table( "temp_temp",
Add Rows( 54 ),
New Column( "TEMP",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[23.23019577, 23.44946668, 23.56111955, 23.47601143, 23.36428639,
23.24016499, 32.42091411, 23, 32.26821731, 32.14990084, 32.42091411,
32.26821731, 32.14990084, 23.23019577, 23.44946668, 23.56111955,
23.47601143, 23.36428639, 23.24016499, 32.15353181, 32.16785998, 21,
32.502366, 32.16261133, 32.15757688, 32.16790474, 23.23019577,
23.44946668, 23.56111955, 23.47601143, 23.36428639, 23.24016499,
32.42091411, 10, 32.26821731, 32.14990084, 32.41334166, 32.17456755,
32.52383338, 32.17310331, 19.28571429, 19.28571429, 19.28571429,
19.28571429, 34.62948075, 34.28766971, 34.29470736, 34.61532486,
34.386807, 34.36554216, 34.58410721, 34.28726312, 23.57142857,
23.57142857]
)
)
);
dt << New Column( "post process", formula( If( :TEMP <= 25, 0, :TEMP ) ) );
dt:post process << delete formula;
dt << New Column( "group_avg",
formula(
value = .;
If( Row() == 1,
flag = 0;
zeroCounter = 0;
);
If( flag == 0 & :post process > 0,
flag = 1;
captureMatrix = [];
Show( "start", Row(), flag );
);
If( :post process == 0 & flag == 1,
zeroCounter
++);
If( flag == 1,
captureMatrix = captureMatrix || Matrix( :post process );
Show( "cap", Row(), captureMatrix );
If( zeroCounter == 4 | Row() == N Rows( dt ),
For( i = N Cols( captureMatrix ), i >= 1, i--,
If( captureMatrix[i] != 0,
Break(),
captureMatrix[i] = .
)
);
value = Mean( captureMatrix );
Show( value );
Show( Row(), captureMatrix, zeroCounter, Index( 1, N Cols( captureMatrix ) - (zeroCounter - 1) ) );
flag = 0;
zeroCounter = 0;
Show( flag );
captureMatrix = [];
);
);
value;
)
);
dt << new column("final Avg",
formula(
if(row()==1,
theRows = current data table() << get rows where(isMissing(:group_avg)==0);
);
If(row()<= nrows(theRows),
value=:group_avg[theRows[Row()]],
value=.
)
)
);
Dieses Skript funktioniert gut für kleine Dateien. Bei großen Dateien mit 16000 Nullen anstelle von 4 reagiert JMP nicht mehr. Gibt es eine Möglichkeit, dies zu verhindern und das Skript ohne Unterbrechung auszuführen?
Ich vermute, dass das Problem darin besteht, dass ich versehentlich mehrere "Show ()" - Anweisungen im Code hinterlassen habe, die viel Schreiben in das JMP-Protokoll erzwungen haben.
Unten finden Sie die Spaltenspezifikation "Nachbearbeitung". Ich gehe davon aus, dass das Problem darin besteht, dass JMP hängen bleibt.Versuchen Sie es auszuführen und prüfen Sie, ob es ausgeführt wird, ohne zu hängen
dt << New Column( "group_avg",
formula(
value = .;
If( Row() == 1,
flag = 0;
zeroCounter = 0;
);
If( flag == 0 & :post process > 0,
flag = 1;
captureMatrix = [];
);
If( :post process == 0 & flag == 1,
zeroCounter
++);
If( flag == 1,
captureMatrix = captureMatrix || Matrix( :post process );
If( zeroCounter == 4 | Row() == N Rows( dt ),
/*For( i = N Cols( captureMatrix ), i >= 1, i--,
If( captureMatrix[i] != 0,
Break(),
captureMatrix[i] = .
)
);*/
if( Row() == N Rows( dt ), zerocounter++ );
value = Mean( captureMatrix[ 1:: ncols(captureMatrix) - (zeroCounter - 1)] );
flag = 0;
zeroCounter = 0;
captureMatrix = [];
);
);
value;
)
);Das erste Skript gibt die richtige Antwort, aber die Ausgabe beider Skripte ist nicht gleich. Warum haben Sie einen Teil des Codes kommentiert?
Die zweite Version des Codes ist effizienter. Angesichts der Datenmenge, die Sie ausführen, dachte ich, dass dies helfen würde.Es sollte die gleichen Ergebnisse liefern.Wenn dies nicht der Fall ist, können Sie versuchen, alle Show () - Anweisungen aus der ersten Version des Codes zu entfernen. Wenn dies funktioniert, können Sie dies tun.