Ciclo continuo? per contare i dati mancanti dal lavoro con più colonne e con nomi di colonne che cambiano nome tra l'analisi (date)Ho una domanda con la quale spero che questa community possa aiutarmi. Desidero aggiungere una colonna che mostri i giorni consecutivi mancanti dall'ultimo giorno e viceversa.
Desidero anche aggiungere una colonna che conta i giorni in cui il risultato è superiore a 0,02 da 7 colonne.
Ho trovato una soluzione per entrambi utilizzando una serie di istruzioni if, ma desidero sapere se è possibile farlo in un modo più elegante, magari utilizzando 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
Modellazione statistica avanzataCombinazione e pulizia dei datiPersonalizzazione di massaCondivisione e comunicazione dei risultatiRi: Ciclo? per contare i dati mancanti dal lavoro con più colonne e con nomi di colonne che cambiano nome tra l'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 vengano denominate con "Max(qualcosa" (e dovrebbe funzionare anche quando sono presenti più di sette colonne "Max(").
Entrambe le colonne formula perderanno la capacità di ricalcolare in caso di modifica dei dati e dovrai eseguirle nuovamente "manualmente" dalle tabelle triangolo rosso se i dati cambiano sul datatable:

Formule per le 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: Ciclo? per contare i dati mancanti dal lavoro con più colonne e con nomi di colonne che cambiano nome tra l'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, in cui il numero di misure ripetute (nel tuo caso i batch si ripetono ogni giorno) poteva cambiare da un'osservazione (batch) a un'altra.
la mia soluzione potrebbe sembrare un po' approssimativa per le tue esigenze, ma penso che dovrebbe funzionare.
ti preghiamo di verificare se è robusto per i 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
Ri: Ciclo? per contare i dati mancanti dal lavoro con più colonne e con nomi di colonne che cambiano nome tra l'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;