Boucle? pour compter les données manquantes du travail avec plusieurs colonnes et avec des noms de colonnes qui changent de nom entre les analyses (dates)J'ai une question pour laquelle j'espère que cette communauté pourra m'aider. Je souhaite ajouter une colonne montrant les jours consécutifs manquants depuis le dernier jour et en arrière.
Je souhaite également ajouter une colonne comptant les jours où le résultat est supérieur à 0,02 sur 7 colonnes.
J'ai trouvé une solution pour les deux en utilisant une série d'instructions if mais je souhaite savoir si cela peut être fait d'une manière plus élégante, peut-être en utilisant une boucle.
Enfin, les dates du tableau changent de semaine en semaine, je souhaite donc que cette formule soit indépendante des noms de colonnes. Est-ce possible?
J'ai joint un tableau de données similaire, avec mes solutions.
Merci d'avance
/ Markku
ScriptingRe: Boucle? pour compter les données manquantes du travail avec plusieurs colonnes et avec des noms de colonnes qui changent de nom entre les analyses (dates)Voici la formule alternative que j'ai proposée
If( Row() == 1,
start = 2;
end = 8;
);
count = end;
While( Is Missing( Column( count )[Row()] ) == 1 & count >= start, count-- );
end - count;
Re: Boucle? pour compter les données manquantes du travail avec plusieurs colonnes et avec des noms de colonnes qui changent de nom entre les analyses (dates)Ma solution est probablement un peu plus compliquée que nécessaire (script complet joint avec la création de la table example_new). Cette solution s'attend à ce que les colonnes d'intérêt soient nommées avec «Max (quelque chose») (et devrait fonctionner même s'il y a plus de sept colonnes «Max (»).
Ces deux colonnes de formule perdront leur capacité à recalculer en cas de changement de données et vous devrez les réexécuter "manuellement" à partir des tables triangle rouge si les données changent sur la table de données:

Formules pour les colonnes:
//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: Boucle? pour compter les données manquantes du travail avec plusieurs colonnes et avec des noms de colonnes qui changent de nom entre les analyses (dates)chère @Markku ,
J'ai également du mal à créer des scripts dynamiques et à les analyser dans une formule de colonne. Dans le passé, j'ai eu une situation similaire à la vôtre, où le nombre de mesures répétées (dans votre cas, les lots se répètent chaque jour) pouvait changer d'une observation (lot) à l'autre.
ma solution peut sembler un peu approximative pour vos besoins mais je pense qu'elle devrait fonctionner.
veuillez vérifier s'il est robuste à différents scénarios que vous pourriez avoir avant utilisation.
avec votre table de données ouverte, exécutez ce script et inspectez les résultats.
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>
Faites-nous savoir si cela fonctionne,
Ron