根據其他表值選擇多行您好,我試圖根據其他表行從一個表中選擇valuse。
我當前的代碼使用循環,但它在大表上真的很慢,我想找到一種方法來提高它的效率。
我的目標是從數據中刪除所有異常值,因此我首先計算分位數,然後將它們循環到主表上以查找匹配的行。最後我刪除了這行。
有沒有辦法在沒有循環的情況下使用我的條件“選擇位置”邏輯?也許就像邏輯一樣。謝謝!
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); Re:根據其他表值選擇多行我希望這種方法可能會更快:
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'有不止一個定義,而且不止一種方法可以處理它們。。。
Re:根據其他表值選擇多行它只計算第一行隔離區。
我想按名稱和實體獲取數據組。Re:根據其他表值選擇多行命令:
colQuantile(:Value, 0.99, :Name, :Entity)
使用:名稱和:實體作為'by'變量,所以應該得到你想要的。在“幫助”>“腳本編制索引”中查找此命令。或許我也不明白。