Sélection de plusieurs lignes en fonction d'une autre valeur de tableBonjour, je tente de sélectionner Valuse dans une table en fonction d’autres lignes.
Mon code actuel utilise la boucle, mais il est très lent sur les grandes tables et je veux trouver un moyen de le rendre plus efficace.
Mon objectif est de supprimer toutes les valeurs aberrantes de mes données. Je calcule d’abord les quantiles puis les boucle sur la table principale pour rechercher les lignes correspondantes. À la fin, je supprime ces lignes.
Existe-t-il un moyen d’utiliser ma logique conditionnelle "Select Where" sans bouclage? Peut-être quelque chose comme mais avec logique. Merci!
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: Sélection de plusieurs lignes en fonction d'une autre valeur de tableJe m'attendrais à ce que cette approche soit plus rapide:
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] = .;
Bien entendu, il existe plus d'une définition du terme "outllier" et plus d'un moyen de les gérer. . .
Re: Sélection de plusieurs lignes en fonction d'une autre valeur de tableIl ne calcule que les premières lignes en quarantaine.
Je veux obtenir le groupe de données par nom et par entité.Re: Sélection de plusieurs lignes en fonction d'une autre valeur de tableLa commande:
colQuantile(:Value, 0.99, :Name, :Entity)
use: Name et: Entity as 'by' variables, vous devriez donc obtenir ce que vous voulez. Recherchez cette commande dans 'Aide> Index de script'. Ou peut-être que je n'ai pas compris.