各列の各セルをループして、指定した値より小さいまたは大きいセルの数をカウントできるスクリプトを作成しようとしています。
列 A ~ D、行 1 ~ 10 からなるテーブルがある場合、セルの値を行方向と列方向にカウントしたいと思います。 言い換えれば、列 A のすべての行について、基準を満たす行がいくつあるかということです。 同様に、行 1 のすべての列について、基準を満たす列がいくつあるかを示します。 次に、すべての行と列に対してこれを実行します。
これが私が始めようとしたものですが、何も返されません。 これに関するアイデアやより効率的な方法はありますか?
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 );
)
)
);
「各行」セクションを、各列の行数を数える行に置き換えることもできます。これにより、各列の各行を調べる必要がなくなり、データテーブル関数が利用されます。
COUNT_VAL=NROWS((DT<<SELECT where=""></SELECT>
スクリプトには簡単に修正できる問題がいくつかあります。
1. for ループのテスト部分が間違っています。
<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>
数値列の数は変わりません。 数値列が 0 または 1 個ある場合、0<=1 および 1<=1 であるため、ループは永久に実行されます。 少なくとも 2 つの数値列がある場合、2(またはそれ以上)<=1 は常に false であるため、ループはまったく実行されません。 テストは次のようになります。
i <= N Items( Numeric Columns )
これは、イテレータ (i) が列数より大きいかどうかをテストし、列数より大きい場合に停止します。
2. For Each Row ループでは、行に添字を付ける必要がありますが、反復を自分で管理する必要はありません。 それでこの作品は:
<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>
次のようになります。
<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. Count 変数はリストですが、数値のように扱っています。 Count++ は、数値が入力されていないリストに対しては何も行いません。 Count = {} の代わりに Count = 0 を設定します。 さらに、Count++ は現在の値を返し、Count を Count +1 に設定します。 したがって、Count = Count++ によって Count の値が変更されることはありません。 (例: カウント = 0. カウント = カウント++。 カウントはまだゼロです。)
上記の変更を加えた完全なスクリプトは次のとおりです。 終了カウントは、すべての数値列内の 101 未満のセルの数です。
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、
メラニー
@abdulj 、
行列を使用して、テストする条件を特定できます。 ここに例を示します。
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]);