JSL: So durchlaufen Sie Spalten, generieren einen Graph Builder-Bericht und speichern sie jeweils als JPG-DateiIch versuche, ein Skript zu erstellen, das jede Zelle jeder Spalte durchlaufen kann, um die Anzahl der Zellen zu zählen, die kleiner oder größer als ein angegebener Wert sind.
Wenn ich eine Tabelle mit den Spalten A bis D und den Zeilen 1 bis 10 habe, möchte ich die Werte der Zellen zeilen- und spaltenweise zählen. Mit anderen Worten: Wie viele von allen Zeilen in Spalte A erfüllen meine Kriterien? Und ähnlich gilt für alle Spalten von Zeile 1, wie viele meinen Kriterien entsprechen. Ich würde das dann für alle Zeilen und Spalten tun.
Hier ist, womit ich zu beginnen versucht habe, aber es gibt nichts zurück. Irgendwelche Ideen dazu oder eine effizientere Möglichkeit, dies zu tun?
Names Default To Here( 1 );
dt = Current Data Table();
Clear Log();
// Get all of the numeric columns in the data table
Numeric Columns = dt << get column names( numeric, string );
NRows = N Rows( dt );
Count = {};
//Column loop
For( i = 1, N Items( Numeric Columns ) <= 1, i++,
For Each Row(
dt,
If( Column(dt, Numeric Columns[i]) < 101,
Count = Count++;
Show( Count );
)
)
);
Betreff: JSL: Wie man Spalten durchläuft, einen Graph Builder-Bericht generiert und jeden als JPG-Datei speichertSie können den Abschnitt „Für jede Zeile“ auch durch eine Zeile ersetzen, um die Anzahl der Zeilen für jede Spalte zu zählen.Dies würde die datierbaren Funktionen nutzen, anstatt jede Zeile jeder Spalte durchsuchen zu müssen.
COUNT_VAL=NROWS((DT<<SELECT where=""></SELECT>
Betreff: JSL: Wie man Spalten durchläuft, einen Graph Builder-Bericht generiert und jeden als JPG-Datei speichertEs gibt einige Probleme mit dem Skript, die leicht behoben werden können.
1. Der Testteil der for-Schleife ist falsch:
<SPAN class="token function">N Items</SPAN><SPAN class="token punctuation">(</SPAN> Numeric Columns <SPAN class="token punctuation">)</SPAN> <SPAN class="token operator"><=</SPAN> <SPAN class="token number">1</SPAN>
Die Anzahl der numerischen Spalten ändert sich nicht. Wenn 0 oder 1 numerische Spalten vorhanden sind, wird die Schleife ewig ausgeführt, da 0<=1 und 1<=1 ist. Wenn mindestens zwei numerische Spalten vorhanden sind, wird die Schleife überhaupt nicht ausgeführt, da 2 (oder mehr) <= 1 immer falsch ist. Der Test sollte so aussehen:
i <= N Items( Numeric Columns )
Dadurch wird getestet, ob Ihr Iterator (i) größer als die Anzahl der Spalten ist, und stoppt, wenn dies der Fall ist.
2. In einer For Each Row-Schleife müssen Sie immer noch einen Index in die Zeile einfügen, Sie müssen die Iteration nur nicht selbst verwalten. Also dieses Stück:
<SPAN class="token function">Column</SPAN><SPAN class="token punctuation">(</SPAN>dt<SPAN class="token punctuation">,</SPAN> Numeric Columns<SPAN class="token punctuation">[</SPAN>i<SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">)</SPAN> <SPAN class="token operator"><</SPAN> <SPAN class="token number">101</SPAN>
Sollte so aussehen:
<SPAN class="token function">Column</SPAN><SPAN class="token punctuation">(</SPAN>dt<SPAN class="token punctuation">,</SPAN> Numeric Columns<SPAN class="token punctuation">[</SPAN>i<SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">)[Row()]</SPAN> <SPAN class="token operator"><</SPAN> <SPAN class="token number">101</SPAN>
3. Ihre Count-Variable ist eine Liste, aber Sie behandeln sie wie eine Zahl. Count++ macht nichts mit einer Liste, die nicht mit Zahlen gefüllt ist. Setzen Sie Count = 0 anstelle von Count = {}. Darüber hinaus gibt Count++ den aktuellen Wert zurück und setzt Count dann auf Count +1. Count = Count++ wird also niemals den Wert von Count ändern. (Beispiel: Anzahl = 0. Anzahl = Anzahl++. Count ist immer noch gleich Null.)
Hier ist das vollständige Skript mit den oben genannten Änderungen. Die Endanzahl ist die Anzahl der Zellen in allen numerischen Spalten, die kleiner als 101 sind.
Names Default To Here( 1 );
dt = Current Data Table();
Clear Log();
// Get all of the numeric columns in the data table
Numeric Columns = dt << get column names( numeric, string );
NRows = N Rows( dt );
Count = 0;
//Column loop
For( i = 1, i <= N Items( Numeric Columns ), i++,
For Each Row(
dt,
If( Column(dt, Numeric Columns[i])[Row()] < 101,
Count++;
Show( Count );
)
)
);
HTH,
Melanie
Betreff: JSL: Wie man Spalten durchläuft, einen Graph Builder-Bericht generiert und jeden als JPG-Datei speichert@abdulj ,
Sie können Matrizen verwenden, um Bedingungen zu identifizieren, anhand derer Sie testen möchten. Hier ist ein Beispiel,
Clear Log();
// Open a sample data set
dt = Open( "$SAMPLE_DATA/Cars.jmp" );
// Extracting numeric column names
ColNames = dt << Get Column Names("String");
NumericCols = [];
for(nCol = 1, nCol <= N Items(ColNames), nCol++,
DType = Column(dt,nCol) << Get Data Type;
If(DType == "Numeric",
NumericCols = NumericCols || nCol;
);
);
NumericColNames = ColNames[NumericCols];
// Extract numeric data only
Mat = dt << Get As Matrix;
// Row Wise Test
// For e.g. Find all rows where year < 90
YearCondition = Loc(Mat[0,1] < 90);
Show(Mat[YearCondition,0]);