他のテーブル値に基づいて複数行を選択するこんにちは、イムは他のテーブル行に基づいて1つのテーブルから値を選択しようとしています。
私の現在のコードはループを使用していますが、大きなテーブルでは本当に遅いので、もっと効率的にする方法を見つけたいと思います。
私の目標は、データからすべての外れ値を削除することです。そのため、最初に分位点を計算し、次にそれらをメインテーブルでループして一致する行を見つけます。最後にこの行を削除します。
ループせずに条件付きの "Select Where"ロジックを使用する方法はありますか?たぶん論理があるような何か。ありがとう
dt << Select Where( Contains( myList, :age ) );
disturbation_table = dt << Summary( Group( :NAME, :ENTITY ), Quantiles( 1, :VALUE ), Quantiles( 99, :VALUE ), Link to original data table( 0 ));
n_rows = NRow(disturbation_table);
//iterate all the disturbation data
For(i = 1, i <= n_rows, i++,
name_value = Column(disturbation_table, "NAME")[i];
entity_value = Column(disturbation_table, "ENTITY")[i];
QuantilesUp = Column(disturbation_table, "Quantiles99(VALUE)")[i];
QuantilesDown = Column(disturbation_table, "Quantiles1(VALUE)")[i];
try(
outliers_rows_to_delete = dt << Select Where(dt:NAME == name_value & dt:ENTITY == entity_value & (dt:VALUE >= QuantilesUp | dt:VALUE <= QuantilesDown), current selection("extend"));
);
);
dt << Delete Rows(outliers_rows_to_delete); 再:他のテーブル値に基づいて複数行を選択する私はこのアプローチがより速いかもしれないと思います:
NamesDefaultToHere(1);
// Make a table to mess with
n = 1000;
numName = 20;
numEntity = 10;
mat = J(n, 1, RandomInteger(numName)) || J(n, 1, RandomInteger(numEntity)) || J(n, 1, RandomNormal());
dt = asTable(mat, << columnNames({"Name", "Entity", "Value"}));
dt << setName("Data");
// Find the quantiles for the 'by' groups
upperCol = dt << NewColumn("99% Quantile", Numeric, Continuous, Formula(colQuantile(:Value, 0.99, :Name, :Entity)));
lowerCol = dt << NewColumn("1% Quantile", Numeric, Continuous, Formula(colQuantile(:Value, 0.01, :Name, :Entity)));
dt << runFormulas;
upperCol << deleteFormula;
lowerCol << deleteFormula;
// Select outliers rows
Wait(3);
outlierRows = dt << getRowsWhere(:Value >= :Name("99% Quantile") | :Value <= :Name("1% Quantile") );
dt << selectRows(outlierRows);
// Remove them?
// Column(dt, "Value")[outlierRows] = .;
もちろん、'outllier'には複数の定義があり、それらを処理する方法は複数あります。。。
再:他のテーブル値に基づいて複数行を選択するその唯一の最初の行の検疫を計算します。
名前とエンティティでデータグループを取得したいです。再:他のテーブル値に基づいて複数行を選択するコマンド:
colQuantile(:Value, 0.99, :Name, :Entity)
'by'変数として:Nameと:Entityを使うので、欲しいものを手に入れましょう。このコマンドは[ヘルプ]> [スクリプティングインデックス]で探してください。または私は理解していませんでした。