¿Lazo? para contar los datos faltantes del trabajo con varias columnas y con nombres de columna que cambian de nombre entre el análisis (fechas)Tengo una pregunta con la que espero que esta comunidad pueda ayudarme. Deseo agregar una columna que muestre los días consecutivos que faltan desde el último día y hacia atrás.
También deseo agregar una columna que cuente los días en los que el resultado es superior a 0.02 de 7 columnas.
He encontrado una solución para ambos usando una serie de declaraciones if pero deseo saber si se puede hacer de una manera más elegante, tal vez usando un bucle.
Por último, las fechas en la tabla cambian semana a semana, por lo que deseo que esta fórmula sea independiente de los nombres de las columnas. es posible?
He adjuntado una tabla de datos de aspecto similar con mis soluciones.
Gracias de antemano
/ Markku
ScriptingRe: bucle para contar los datos faltantes del trabajo con varias columnas y con nombres de columna que cambian de nombre entre el análisis (fechas)Aquí está la fórmula alternativa que se me ocurrió
If( Row() == 1,
start = 2;
end = 8;
);
count = end;
While( Is Missing( Column( count )[Row()] ) == 1 & count >= start, count-- );
end - count;
Re: bucle para contar los datos faltantes del trabajo con varias columnas y con nombres de columna que cambian de nombre entre el análisis (fechas)Lo más probable es que mi solución sea un poco más complicada de lo necesario (script completo adjunto con la creación de la tabla example_new). Esta solución espera que las columnas de interés se nombren con "Max (algo" (y debería funcionar incluso cuando hay más de siete columnas "Max (").
Estas dos columnas de fórmula perderán su capacidad de volver a calcular el cambio de datos y tendrá que volver a ejecutarlas "manualmente" desde las tablas del triángulo rojo si los datos cambian en la tabla de datos:

Fórmulas para columnas:
//modified idea based on of @txnelson solution
tempCol = dt << New Column("# last days missing_community", Numeric, Nominal,
Formula(
Local({
//get information on column names
dt = Current Data Table(),
colNames = dt << Get Column Names(String)
},
//get list of column names with only Max( in name
For(i = N Items(colNames), i > 0, i--,
If(!Contains(colNames[i], "Max("),
Remove From(colNames, i);
)
);
//get values on rows
//this might make a mistake if columns before Max( have are missing values
matLength = N Items(colNames) + 1;
rowValues = dt[Row(), 0][1::matLength];
count = 0;
//calculate missing values from the end of matrix and stop on first found value
While(Is Missing(rowValues[matLength]), count++; matLength--);
count;
)
)
);
dt << New Column("#days higher than 0,02_community", Numeric, Nominal,
Formula(
Local({
//get information on column names
dt = Current Data Table(),
colNames = dt << Get Column Names(String)
},
//get values on row and set values of colums without Max( in name to 0
rowVals = dt[Row(), 0];
For(i = N Items(colNames), i > 0, i--,
If(!Contains(colNames[i], "Max("),
rowVals[i] = 0;
)
);
//create matrix with 0 and 1 based on if value is over 0.02
rowVals_over = rowVals > 0.02;
//get sum of previous matris to calculate Max( columns with values over 0.02
Sum(rowVals_over);
);
)
);
Re: bucle para contar los datos faltantes del trabajo con varias columnas y con nombres de columna que cambian de nombre entre el análisis (fechas)querido @Markku ,
También me cuesta crear scripts dinámicos y analizarlos en una fórmula de columna. En el pasado tuve una situación similar a la suya, donde el número de medidas repetidas (en su caso, los lotes se repiten cada día) podría cambiar de una observación (lote) a otra.
mi solución puede parecer un poco aproximada para sus necesidades, pero creo que debería funcionar.
compruebe si es robusto para los diferentes escenarios que pueda tener antes de su uso.
con su tabla de datos abierta, ejecute este script e inspeccione los resultados.
Names Default To Here( 1 );
dt = Current Data Table();
// get list of columns
Cols = dt << get column names ( Continuous );
maxlist = {};
For( i = 1, i <= N Items( cols ), i++,
If( Contains( cols[i], "Max" ),
Insert Into( maxlist, cols[i] )
)
);
dt2 = dt << Stack(
columns(maxlist ),
Source Label Column( "Time" ),
Stacked Data Column( "Data" )
);
dt2 << Sort(
By( :Batch#, :Time ),
Order( Ascending, Descending ),
replace table
);
dt2 <<NEW column=""> :Index2 ) << delete rows ();
dt3 = dt2 << Summary(
Group( :Batch# ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 ),
);
close (dt2, no save);
dt3:N Rows << set name ("No of last days missing");
dt << new column ("No of last days missing", set each value (0));
dt << Update(
With( dt3 ),
Match Columns( :Batch# = :Batch# )
);
close (dt3, no save);
//
dt5 = dt << Stack(
columns(maxlist ),
Source Label Column( "Time" ),
Stacked Data Column( "Data" )
);
dt5 << select where (ismissing (:Data)) << delete rows;
dt5 << select where (:Data<=0.02) << delete rows;
dt6 = dt5 << Summary(
Group( :Batch# ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 )
);
close (dt5, no save);
dt6:N Rows << set name ("Days over 0.02");
dt << new column("Days over 0.02", set each value(0));
dt<< Update(
With( dt6 ),
Match Columns( :Batch# = :Batch# )
);
close (dt6, no save);
<BR /></NEW>
Permítanos saber si funciona,
Ron