53 colonnes de temps, certaines vides et d'autres remplies. Comment puis-je écrire une formule garantissant que la colonne la plus remplie est supérieure à la colonne remplie suivante, etc.Si j'ai des centaines de lignes, chaque ligne est un ticket de travail distinct, chaque ligne peut avoir jusqu'à 53 colonnes de temps remplies, mais la plupart n'ont que certaines de ces colonnes remplies et celles entre les deux sont vides.
Donc, disons pour la ligne n°1 : j'ai la colonne 1, la colonne 23 et la colonne 36 qui sont les seules colonnes contenant un horodatage, j'aurai besoin de savoir que 36>23 et 23>1.
Pour la ligne n°2, toutes les colonnes ont des horodatages, je dois donc savoir que [53>52,............,2>1].
Merci
Fiona
Modélisation statistique avancéeÉtudes de marché et de consommationRe : 53 colonnes de temps, certaines vides et d'autres remplies. Comment puis-je écrire une formule garantissant que la colonne remplie la plus élevée est> que la prochaine colonne remplie, etc.Jarmo,
Cela fonctionne très bien aussi.
Je n'ai pas fait grand-chose avec Matrices mais ça a l'air intéressant. Je vais devoir le parcourir et m'assurer de le comprendre.
Merci
Re : 53 colonnes de temps, certaines vides et d'autres remplies. Comment puis-je écrire une formule garantissant que la colonne remplie la plus élevée est> que la prochaine colonne remplie, etc.Voici une solution possible à l'aide de Matrices.Si aucune information sur le nom de la colonne n'est nécessaire, elle peut être raccourcie en supprimant result_column et les calculs qui s'y rapportent.
Names Default To Here(1);
dt = Current Data Table();
result_flag = [];
result_column = {};
For Each Row(dt,
m_all = dt[Row(), 0]; //get all values of row to matrix
m_values = m_all[Loc(m_all)]; //remove missing values;
start = Insert(m_values[1::N Items(m_values)-1], 0, 1); //shift right by 0 and remove last value
end = m_values;
//if we only want to know if any value is smaller than previous, we can just us any
Insert Into(result_flag, Any(end - start < 0)); //we could stop here if we don't want to know the column name
//but that doesn't tell us which column(s) breaks the "rule"
idx = Loc(end - start < 0); //indices of value matrix which break the rule -> will require checking for empty
If(N Items(idx) == 0,
Insert Into(result_column, "");
, //else
breaking_col = Min(Loc(m_all, m_values[Min(idx)])); //values which break rule, we can most likely just get the first index?
Insert Into(result_column, Column(dt, breaking_col) << get name);
);
);
dt << New Column("Flag", Numeric, Nominal, Values(result_flag));
dt << New Column("Column_Flag", Character, Nominal, Values(result_column));Pourrait très probablement être également utilisé comme formule, mais ne le recommanderait probablement pas car il est assez facile à casser :
dt << New Column("Formula_Flag", Numeric, Nominal, Formula(
dt = Current Data Table();
m_all = Matrix(dt[Row(), 0]);
m_values = m_all[Loc(m_all)];
start = Insert(m_values[Index(1, N Items(m_values) - 1)], 0, 1);
end = m_values;
Any(end - start < 0);
));
Re : 53 colonnes de temps, certaines vides et d'autres remplies. Comment puis-je écrire une formule garantissant que la colonne remplie la plus élevée est> que la prochaine colonne remplie, etc.C'est génial, même mieux que ce que je demandais car cela me dit exactement où la condition est fausse.
Merci!
Re : 53 colonnes de temps, certaines vides et d'autres remplies. Comment puis-je écrire une formule garantissant que la colonne remplie la plus élevée est> que la prochaine colonne remplie, etc.Je ne suis pas exactement sûr que c'est ce que vous voulez, mais le script ci-dessous analyse les colonnes et s'assure que toutes les valeurs de date augmentent à partir de la date précédente.Sinon, il place le nom de la colonne qui a détecté une date antérieure à la date précédente.
Names Default To Here( 1 );
dt = Current Data Table();
If( Try( dt:flag << get name, "" ) == "",
dt << New Column( "Flag", Character )
);
For( rowNum = 1, rowNum <= N Rows( dt ), rowNum++,
For( startCol = 1, startCol <= N Cols( dt ), startCol++,
If( Is Missing( Column( startCol )[rowNum] ) == 0,
holdVal = Column( startCol )[rowNum];
Break();
)
);
For( col = startCol + 1, col <= N Cols( dt ) - 1, col++,
If( Is Missing( Column( Col )[rowNum] ) == 0,
If( Column( Col )[rowNum] < holdVal,
dt:Flag[rowNum] = (Column( Col )) << get name;
holdVal = Column( col )[rowNum];
Break();
,
holdVal = Column( Col )[rowNum]
)
)
);
);Re : 53 colonnes de temps, certaines vides et d'autres remplies. Comment puis-je écrire une formule garantissant que la colonne remplie la plus élevée est> que la prochaine colonne remplie, etc.Juste pour clarifier; Ils devraient tous être corrects, donc je pense que le moyen le plus simple est d'avoir une colonne de signalisation qui affichera un "1" à la fin de n'importe quelle ligne là où ce n'est pas le cas ci-dessus.