Ich habe eine CSV-Datei, die temporäre Werte speichert. Ich muss den Gruppendurchschnitt für bestimmte Stichproben anhand der folgenden Schritte ermitteln:
1. Setzen Sie alle temporären Werte kleiner als 25 auf Null, dh Spalte post_process
2. Die Spalte „group_avg“ wird durch Ignorieren von Zeilen mit mehr als oder gleich 4 aufeinanderfolgenden Nullen abgeleitet. Anschließend wird der Durchschnitt der Probengruppe berechnet, wie unten gezeigt
3. Die Spalte „final_average“ enthält die Ergebnisse, die aus der Spalte „group_avg“ generiert wurden
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:

Die zweite Version des Codes ist effizienter. Angesichts der Menge an Daten, die Sie verwenden, dachte ich, dass es helfen würde.Es sollte die gleichen Ergebnisse liefern.Wenn dies nicht der Fall ist, können Sie versuchen, einfach alle Show()-Anweisungen aus der ersten Version des Codes zu entfernen, und wenn das funktioniert.
Das erste Skript gibt die richtige Antwort, aber die Ausgabe beider Skripte ist nicht gleich. Warum haben Sie einen Teil des Codes kommentiert?
Ich vermute, dass das Problem darin besteht, dass ich versehentlich mehrere „Show()“-Anweisungen im Code hinterlassen habe, was dazu geführt hat, dass viel in das JMP-Protokoll geschrieben wurde.
Nachfolgend finden Sie die Spaltenspezifikation „Nachbearbeitung“, bei der es sich meiner Meinung nach um den Teil handelt, der das Problem verursacht, das dazu führt, dass JMP hängen bleibt.Probieren Sie es aus und sehen Sie, ob es läuft, 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;
)
);Dieses Skript funktioniert gut für kleine Dateien. Aber bei großen Dateien, bei denen wir 16000 Nullen statt 4 haben, reagiert JMP nicht mehr. Gibt es eine Möglichkeit, dies zu verhindern und das Skript ohne Absturz auszuführen?
Hier ist ein Skript, das Ihre Datentabelle nur mit der TEMP-Spalte erstellt. Anschließend werden die restlichen 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=.
)
)
);