Bonjour à tous,
Ma question est double. Mes données ressemblent à ceci :
| 1-A | X | oui | . | . | . | . |
| 1-A | . | . | z | q | . | . |
| 1-A | . | . | . | . | w | w |
| 2-B | oui | w | . | . | . | . |
| 2-B | . | . | t | oui | . | . |
| 2-B | . | . | . | . | q | p |
Je voudrais A) supprimer les points de données vides et
regrouper les lignes en fonction de l'identifiant de la première colonne que chaque ligne a en commun (c'est-à-dire 1-A et 2-B).
J'aimerais que mon résultat final ressemble à ceci :
Quelqu'un a-t-il des suggestions pour aborder ce problème pour une grande table contenant des centaines de valeurs ?
Merci d'avance,
Charlie
Il est temps de passer aux gros canons.Voici un script qui devrait fonctionner.Fondamentalement, la façon dont cela fonctionne consiste à parcourir toutes les lignes et colonnes.Si la ligne suivante a le même ID, elle transmet les valeurs non manquantes à la ligne suivante.À la dernière ligne d'un ID donné, toutes les valeurs non manquantes doivent se trouver dans cette ligne.Lors de la dernière étape, vous supprimez toutes les lignes supplémentaires.
dt = Current Data Table();
dt << New Column( "Delete Later", character, formula( If( :ID[Row()] == :ID[Row() + 1], "Yes", "No" ) ) );
for(i=1,i<=N Row(dt),i++, //iterate through each row
//If next row has same ID, pass non-missing values down to next row
If(:Delete Later[i] == "Yes",
for(j=2,j<= (N Col(dt) - 1),j++, //iterate through each column (except ID and Delete Later)
//pass non-missing data down to next row
if(!isMissing(Column(dt,j)[i]), Column(dt,j)[i+1] = Column(dt,j)[i])
)
)
);
//Collapse all the extra rows
dt << Select Where(:Delete Later == "Yes") << Delete Rows();
Cela a parfaitement fonctionné pour votre exemple.Cela devrait fonctionner pour votre table, mais si vous avez des millions de lignes, cela peut prendre beaucoup de temps.Ce script suppose également que la colonne est nommée « ID » et que toutes les autres colonnes doivent avoir des valeurs non manquantes pour une seule ligne pour chaque ID.
Table de départ que j'ai utilisée pour tester le script :
Tableau final :
Script pour recréer ma table de départ :
New Table( "ConsolidateTable",
Add Rows( 6 ),
New Column( "ID",
Character( 3 ),
"Nominal",
Set Values( {"1-A", "1-A", "1-A", "2-B", "2-B", "2-B"} ),
Set Display Width( 87 )
),
New Column( "Column 2",
Character( 16 ),
"Nominal",
Set Values( {"x", "", "", "y", "", ""} ),
Set Display Width( 87 )
),
New Column( "Column 3",
Character( 16 ),
"Nominal",
Set Values( {"y", "", "", "w", "", ""} ),
Set Display Width( 87 )
),
New Column( "Column 4",
Character( 16 ),
"Nominal",
Set Values( {"", "z", "", "", "t", ""} ),
Set Display Width( 87 )
),
New Column( "Column 5",
Character( 16 ),
"Nominal",
Set Values( {"", "q", "", "", "y", ""} ),
Set Display Width( 87 )
),
New Column( "Column 6",
Character( 16 ),
"Nominal",
Set Values( {"", "", "w", "", "", "q"} ),
Set Display Width( 87 )
),
New Column( "Column 7",
Character( 16 ),
"Nominal",
Set Values( {"", "", "w", "", "", "p"} ),
Set Display Width( 87 )
)
)Malheureusement, ce tableau comporte plus de 1 000 colonnes. Merci pour la suggestion, mais cela ne semble pas réalisable.
Supposons maintenant que je veuille ignorer les données vierges et m'en occuper plus tard. Comment puis-je consolider les lignes ?Espérons que cette étape soit plus réalisable.
Si vous n'avez pas trop de colonnes, vous pouvez d'abord les définir toutes en caractères, suivre les étapes que j'ai recommandées, puis reconvertir les colonnes numériques.Si votre tableau est beaucoup plus large que votre exemple, cela n'est peut-être pas très réalisable.
Malheureusement les données sont mixtes : catégorielles, binaires, numériques, texte libre. Je cherche à simplifier la base de données et à supprimer les entrées vides inutiles. Merci pour la suggestion, mais je ne pense pas que cela fonctionnera pour ce scénario.
Si les données sont numériques, à l'exclusion de la première colonne, vous pouvez simplement utiliser
Tableaux==>Résumé
et précisez de générer une moyenne ou une somme pour les colonnes en question
Merci pour la réponse rapide. Je dois ajouter que j'ai passé sous silence une grande partie des détails de mon tableau actuel. Par exemple, lorsque j'essaie l'étape 1, JMP me dit "Impossible de piler. Les colonnes empilées sont de types de données différents".
Existe-t-il un moyen d'empiler des colonnes de différents types de données ?
La façon la plus simple de procéder serait de :
1. Empilez toutes ces colonnes à l'exception de la colonne ID afin qu'elles soient toutes consolidées en une seule colonne de données (la colonne Étiquette résultante maintient la traçabilité).
2. Supprimez toutes les lignes avec des valeurs manquantes dans la nouvelle colonne de données. Méthode simple : sélectionnez une valeur manquante > cliquez dessus avec le bouton droit > sélectionnez les cellules correspondantes > cliquez avec le bouton droit > supprimez les lignes.
3. Effectuez une division du tableau pour revenir à la forme originale du tableau de données. La colonne fractionnée est la nouvelle colonne de données. Split By est la nouvelle colonne d'étiquette et vous pouvez regrouper par la colonne ID.