Bonjour, j'ai besoin d'aide pour nettoyer certaines données. Les données du tableau contiennent plusieurs identifiants, dates et catégories. Je m'intéresse aux identifiants de catégorie 1 et 2, ou 1 et 2 et 3, ou 1 et 3, tout en ne conservant que les entrées avec la date maximale pour chaque catégorie. Pourriez-vous s'il vous plaît fournir le meilleur script pour cette solution ? Merci!
| IDENTIFIANT | catégorie | date | coûtA | coûtB | coûtC | coûtD |
| 1 | 1 | 21/01/16 | 5000 | 0 | 3000 | 500 |
| 1 | 1 | 21/01/16 | 1000 | 5000 | 10000 | 0 |
| 1 | 1 | 21/01/16 | 20000 | 0 | dix | 50 |
| 1 | 2 | 22/01/16 | 3000 | 0 | 0 | 50000 |
| 1 | 3 | 01/02/16 | 1 | dix | 900 | 0 |
| 2 | 1 | 02/04/13 | 0 | 100 | 10000 | 5000 |
| 2 | 2 | 03/04/13 | 0 | 0 | 0 | 642.49 |
| 2 | 1 | 02/04/13 | 1 | dix | 900 | 0 |
| 3 | 2 | 06/03/15 | 50 | 0 | 0 | 259,58 |
Voici une façon d'aborder cela en utilisant les fonctions Col
Names Default To Here(1);
dt = New Table("Untitled 3",
Add Rows(11),
Compress File When Saved(1),
New Column("ID", Numeric, "Continuous", Format("Best", 12), Set Values([1, 1, 1, 2, 3, 3, 4, 4, 4, 4, 4])),
New Column("Category", Character, "Nominal", Set Values({"A", "A", "B", "A", "A", "C", "A", "A", "B", "B", "C"})),
New Column("Date", Numeric, "Continuous", Format("Best", 12), Set Values([1, 1, 2, 1, 1, 2, 1, 2, 1, 2, 1]))
);
dt << New Column("KEEP", Numeric, Nominal, Formula(
Col Sum(Row() == Col Min(Row(), :category, :id), :id) > 1 & :date == Col Max(:date, :category, :id)
));
Modifiez la formule en << Sélectionner où / << Obtenir les lignes où ou utilisez-la avec un sous-ensemble pour prendre les lignes que vous souhaitez conserver.

Modifier:
La version originale ne tenait pas compte du fait que la catégorie 1 pourrait être manquante (cela suppose que la catégorie est une colonne numérique)
New Column("KEEP", Numeric, Nominal, Formula(
Col Sum(Row() == Col Min(Row(), :category, :id), :id) > 1
& :date == Col Max(:date, :category, :id)
& Col Sum(If(:category == 1, 1, .), :id)
));
Mon exemple ci-dessus avait Category comme colonne de caractères. Votre exemple est numérique. J'ai également changé la logique pour m'assurer qu'il y a au moins les catégories 1&2, 1&3 ou 1&2&3
Names Default To Here( 1 );
dt = Current Data Table();
For Each Row(
If( :date == Col Maximum( :date, :ID ),
currID = :ID;
cats = Associative Array( dt:category[dt << get rows where( :ID == currID )] ) << get keys;
show(cats);
If( Length( cats ) > 1,
If( cats[1] == 1 & (cats[2] == 2 | cats[2] == 3),
dt << select rows( Row() )
)
);
)
);
dtNew = dt << subset( selected columns( 0 ), selected rows( 1 ), output table( "Final" ) );
Jim,
Merci pour votre aide. Je m'excuse pour toute confusion. J'ai besoin de chaque identifiant qui doit avoir les catégories 1 et 2 et/ou 3 dans le tableau final. S'il existe des identifiants répétés avec la même catégorie, j'ai besoin de la ligne contenant la date maximale. Le tableau doit être fourni ici. Merci d'avance pour votre aide.
| IDENTIFIANT | catégorie | date | coûtA | coûtB | coûtC | coûtD |
| 1 | 1 | 21/01/16 | 20000 | 0 | dix | 50 |
| 1 | 2 | 22/01/16 | 3000 | 0 | 0 | 50000 |
| 2 | 1 | 02/04/13 | 0 | 100 | 10000 | 5000 |
| 2 | 2 | 03/04/13 | 0 | 0 | 0 | 642.49 |
| 3 | 1 | 06/03/15 | 3000 | 0 | 0 | 817 |
| 3 | 2 | 06/03/15 | 50 | 0 | 0 | 259,58 |
| 4 | 1 | 06/03/15 | 10000 | 0 | 0 | 710.16 |
| 4 | 2 | 06/03/15 | 5000 | 0 | 0 | 1087 |
| 4 | 3 | 16/03/15 | 0 | 0 | 0 | 326,7 |
Voici un petit script qui devrait fonctionner. Il trouve les lignes qui correspondent à votre définition. Ces lignes sont ensuite regroupées dans un nouveau tableau.
Names Default To Here( 1 );
dt = Current Data Table();
For Each Row(
If( :date == Col Maximum( :date, :ID ),
currID = :ID;
//currID="1"
cats = Associative Array( dt:category[dt << get rows where( :ID == currID )] ) << get keys;
If( cats[1] == "1" & Length( cats ) > 1,
dt << select rows( Row() )
);
)
);
dtNew = dt << subset( selected columns(0), selected rows(1),
output table("Final")
);
// The above code will allow multiple rows within a given ID, when there are
// multiple rows with the same maximum date. Run the below code to
// get rid of the multiple entries, if that is what is desired
dtNew << select duplicate rows(Match(:ID));
dtNew << delete rows;


Si les 2 dernières lignes du script ci-dessus sont exécutées, les lignes d'ID en double sont supprimées.
