Seleccionando múltiples filas basadas en otro valor de tablaHola, estoy tratando de seleccionar valuse de una tabla basada en otras filas de la tabla.
Mi código de uso actual es un bucle, pero es muy lento en tablas grandes y quiero encontrar una manera de hacerlo más eficiente.
Mi objetivo es eliminar todos los valores atípicos de mis datos, así que primero calculo los cuantiles y luego los coloco sobre la tabla principal para encontrar las filas correspondientes. Al final borro estas filas.
¿Hay alguna forma de usar mi lógica condicional "Seleccionar dónde" sin hacer un bucle? Tal vez algo así pero con lógica. ¡Gracias!
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: Seleccionando múltiples filas basadas en otro valor de tablaEspero que este enfoque sea más rápido:
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] = .;
Por supuesto, hay más de una definición de 'outllier', y más de una forma de manejarlos. . .
Re: Seleccionando múltiples filas basadas en otro valor de tablaSolo se calculan las primeras filas de cuarentenas.
Quiero obtener el grupo de datos por nombre y entidad.Re: Seleccionando múltiples filas basadas en otro valor de tablaEl comando:
colQuantile(:Value, 0.99, :Name, :Entity)
utiliza: Nombre y: Entidad como variables 'por', por lo que debería obtener lo que desea. Busque este comando en 'Ayuda> Índice de secuencias de comandos'. O tal vez no lo he entendido.