Selezione di più righe in base ad altro valore di tabellaCiao, sto cercando di selezionare il valore da una tabella in base ad altre righe della tabella.
Il mio attuale codice usa il ciclo ma è molto lento sui grandi tavoli e voglio trovare un modo per renderlo più efficiente.
Il mio obiettivo è quello di rimuovere tutti i valori anomali dai miei dati, quindi prima di tutto calcoliamo i quantili e li colleghiamo alla tabella principale per trovare le righe corrispondenti. Alla fine cancello queste righe.
C'è un modo per usare la mia logica condizionale "Select Where" senza fare il loop? Forse qualcosa di simile, ma con logica. Grazie!
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); Ri: Selezione di più righe in base ad altro valore di tabellaMi aspetto che questo approccio sia più veloce:
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] = .;
Naturalmente esistono più definizioni di "outllier" e più di un modo per gestirle. . .
Ri: Selezione di più righe in base ad altro valore di tabellaCalcola solo le quarantene delle prime file.
Voglio ottenere il gruppo di dati per nome e entità.Ri: Selezione di più righe in base ad altro valore di tabellaIl comando:
colQuantile(:Value, 0.99, :Name, :Entity)
usa: Nome e: Entità come variabili 'by', quindi dovresti ottenere ciò che desideri. Cerca questo comando in 'Aiuto> Scripting Index'. O forse non ho capito.