Ciclo continuo? contare i dati mancanti dal lavoro con più colonne e con nomi di colonne che cambiano i nomi tra le analisi (date)Ho una domanda che spero che questa comunità possa aiutarmi. Vorrei aggiungere una colonna che mostri i giorni consecutivi mancanti dall'ultimo giorno e viceversa.
Vorrei anche aggiungere una colonna che conti i giorni in cui il risultato è superiore a 0,02 da 7 colonne.
Ho trovato una soluzione per entrambi usando una serie di istruzioni if ma desidero imparare se può essere fatto in un modo più elegante, magari usando un ciclo.
Infine, le date nella tabella cambiano di settimana in settimana, quindi desidero che questa formula sia indipendente dai nomi delle colonne. È possibile?
Ho allegato una tabella dati dall'aspetto simile, con le mie soluzioni.
Grazie in anticipo
/ Markku
ScriptingRi: Loop? contare i dati mancanti dal lavoro con più colonne e con nomi di colonne che cambiano i nomi tra le analisi (date)Ecco la formula alternativa che mi è venuta in mente
If( Row() == 1,
start = 2;
end = 8;
);
count = end;
While( Is Missing( Column( count )[Row()] ) == 1 & count >= start, count-- );
end - count;
Ri: Loop? contare i dati mancanti dal lavoro con più colonne e con nomi di colonne che cambiano i nomi tra le analisi (date)La mia soluzione è molto probabilmente un po 'più complicata del necessario (script completo allegato con la creazione della tabella example_new). Questa soluzione prevede che le colonne di interesse siano denominate con "Max (qualcosa" (e dovrebbe funzionare anche quando ci sono più di sette colonne "Max (").
Entrambe le colonne formula perderanno la capacità di ricalcolare al cambio di dati e dovrai rieseguirle "manualmente" dalle tabelle triangolo rosso se i dati cambiano sul datatable:

Formule per colonne:
//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);
);
)
);
Ri: Loop? contare i dati mancanti dal lavoro con più colonne e con nomi di colonne che cambiano i nomi tra le analisi (date)caro @Markku ,
Faccio anche fatica a creare script dinamici e ad analizzarli in una formula di colonna. In passato ho avuto una situazione simile alla tua, dove il numero di misure ripetute (nel tuo caso i lotti si ripetono ogni giorno) poteva cambiare da un'osservazione (batch) all'altra.
la mia soluzione potrebbe sembrare un po 'approssimativa per le tue esigenze, ma penso che dovrebbe funzionare.
per favore controlla se è robusto per diversi scenari che potresti avere prima dell'uso.
con la tabella dati aperta, esegui questo script e controlla i risultati.
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>
facci sapere se funziona,
Ron