Boucle? compter les données manquantes d'un 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 indiquant les jours consécutifs manquants depuis le dernier jour et vers l'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 de manière plus élégante, peut-être en utilisant une boucle.
Enfin, les dates dans le 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
Modélisation statistique avancéeMélange et nettoyage des donnéesPersonnalisation de massePartager et communiquer les résultatsRe : Boucle ? compter les données manquantes d'un 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 à la création de table example_new). Cette solution s'attend à ce que les colonnes d'intérêt soient nommées avec "Max(quelque chose" (et devraient fonctionner même lorsqu'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 du triangle rouge des tables 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 ? compter les données manquantes d'un travail avec plusieurs colonnes et avec des noms de colonnes qui changent de nom entre les analyses (dates)Cher @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) à une autre.
ma solution peut sembler un peu difficile pour vos besoins mais je pense qu'elle devrait fonctionner.
veuillez vérifier s'il est robuste aux 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
Re : Boucle ? compter les données manquantes d'un 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 trouvée
If( Row() == 1,
start = 2;
end = 8;
);
count = end;
While( Is Missing( Column( count )[Row()] ) == 1 & count >= start, count-- );
end - count;