Auswählen mehrerer Zeilen basierend auf einem anderen TabellenwertHallo, ich versuche, valuse aus einer Tabelle basierend auf anderen Tabellenzeilen auszuwählen.
Meine aktuelle Code-Verwendungsschleife ist jedoch bei großen Tabellen wirklich langsam und ich möchte einen Weg finden, sie effizienter zu machen.
Mein Ziel ist es, alle Ausreißer aus meinen Daten zu entfernen. Ich berechne zuerst die Quantile und schleife sie dann über die Haupttabelle, um die passenden Zeilen zu finden. Am Ende lösche ich diese Zeilen.
Gibt es eine Möglichkeit, meine bedingte "Select Where" -Logik ohne Schleifen zu verwenden? Vielleicht sowas aber mit Logik. Vielen Dank!
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); Betreff: Auswählen mehrerer Zeilen basierend auf einem anderen TabellenwertIch würde erwarten, dass dieser Ansatz schneller sein könnte:
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] = .;
Natürlich gibt es mehr als eine Definition von "Outllier" und mehr als eine Möglichkeit, mit ihnen umzugehen. . .
Betreff: Auswählen mehrerer Zeilen basierend auf einem anderen TabellenwertEs werden nur die ersten Zeilen unter Quarantänen berechnet.
Ich möchte die Datengruppe nach Namen und Entität abrufen.Betreff: Auswählen mehrerer Zeilen basierend auf einem anderen TabellenwertDer Befehl:
colQuantile(:Value, 0.99, :Name, :Entity)
verwendet: Name und: Entity als 'by' -Variable, sollte also bekommen, was Sie wollen. Suchen Sie nach diesem Befehl in "Hilfe> Skriptindex". Oder habe ich vielleicht nicht verstanden.