Problème de table de données divisée<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'ai un problème avec le fractionnement d'une table de données et je me demandais si quelqu'un savait comment procéder. Mes données ressemblent à ceci :

Les données doivent être divisées par ID2 avec IDENTIFIANT étant la variable de groupe. En procédant de cette façon, j'obtiens ce résultat :

Le problème est que pour IDENTIFIANT s 2 et 4, il y a plusieurs valeurs de C dans la colonne ID2 . Il semble que JMP utilise toujours la dernière valeur de la table de données divisée.
Existe-t-il un moyen automatique de le faire pour que je me retrouve avec un tableau comme celui-ci ?

Ici, il y a deux lignes pour les ID 2 et 4 représentant les différentes valeurs de C dans les données d'origine.
Merci pour votre aide!
Sébastien
Re : Problème de division de table de donnéesmerci msharp ,
ça marche très bien.
et vous écrivez, garder les choses simples est probablement la meilleure façon de procéder.
Re : Problème de division de table de donnéesJe resterais à l'écart de cette approche en général, les données statiques sont généralement plus sûres que les données dynamiques. Vous devez vous demander quelle est l’importance de l’ordre des données ?Cette solution gardera les clés en ordre, mais les valeurs seront libres de se déplacer.MAIS...
Cette solution ne fonctionnera qu'avec des colonnes numériques.Si nous devions remplacer :ID2 par :ID2Num où A = 1, B = 2 ect. vous pouvez simplement utiliser une instruction &, donc :Sum( :ID[Index( 1, Row() )] == :ID & :ID2Num[Index( 1, Row() )] == :ID2Num ) pour la formule.
Si vous avez des colonnes de personnages, vous devrez être plus créatif.Ainsi pour la formule :
length(concat items(:ID2[Index( 1, Row() )],"")) - length(substitute(concat items(:ID2[Index( 1, Row() )],""), :ID2, ""))
ou
dt1 << Nouvelle colonne ("Concat", Caractère, Nominal, Formule (:ID2 || char(:ID)));
dt1 << Nouvelle colonne("Répéter", Caractère, Nominal, Formule((longueur(éléments concat(:Concat[Index( 1, Row() )],"")) - longueur(substituer(éléments concat(:Concat[ Index( 1, Row() )],""), :Concat,"")))/2)); //le 2 à la fin représente la longueur de la chaîne concaténée
Il se passe beaucoup de choses ici et je n’ai pas l’énergie de l’expliquer maintenant.Mais faites-moi savoir si vous avez des questions ; en réalité, il existe une solution plus simple et plus viable ci-dessus.
Re : Problème de division de table de donnéesmerci msharp ,
à propos, dans un article précédent, @ms a proposé cette formule d'indexation :Sum( :ID[Index( 1, Row() )] == :ID ) @MS proposé cette formule pour l'indexation :Sum( :ID[Index( 1, Row() )] == :ID )
Re : Syntaxe : Comment créer une colonne d'index par ID
existe-t-il un moyen de l'utiliser dans ce contexte ? avec deux colonnes d'index et l'une d'elles est alphabétique ?
meilleur,
Ron
Re : Problème de division de table de donnéesJe combine/résume simplement ce qui a été mentionné. Assurez-vous de trier les données au préalable, sinon la fonction Lag() aura des problèmes.De plus, l’utilisation d’une formule sera plus rapide qu’une commande for each row().Si vous craignez que le tri des publications puisse affecter la fonction lag() ultérieurement, supprimez simplement la formule pour éviter les conflits.Ainsi:
NomsDefaultToHere ( 1 ) ;
// Tableau
dt1 = Nouveau tableau ( "Sébastien" ,
Nouvelle colonne ( "IDENTIFIANT" ,
Numérique ,
"Nominal" ,
Format ( "Meilleur" , 12 ) ,
Définir les valeurs ( [ 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 2 , 2 ] )
) ,
Nouvelle colonne ( "ID2" ,
Personnage ,
"Nominal" ,
Définir les valeurs (
{ "UN" , "B" , "C" , "D" , "UN" , "B" , "C" , "C" , "UN" , "B" , "C" , "D" , "UN" , "B" ,
"C" , "C" , "C" , "B" }
)
) ,
Nouvelle colonne ( "Valeur" ,
Numérique ,
"Nominal" ,
Format ( "Meilleur" , 12 ) ,
Définir les valeurs (
[ 111 , 222 , 333 , 444 , 111 , 222 , 333 , 555 , 111 , 222 , 555 , 444 , 111 , 222 ,
555 , 666 , 777 , 888 ]
)
)
) ;
// le tableau doit être trié pour que la formule de l'étape suivante fonctionne
dt1 << Trier ( Remplacer le tableau ,
Par ( : IDENTIFIANT , : ID2 ) ,
Commande ( Ascendant , Ascendant )
) ;
// Ajout d'une colonne auxiliaire
dt1 << Nouvelle colonne ( "Répéter" ,
Numérique ,
"Nominal" ,
Format ( "Meilleur" , 12 ) ,
Formule ( Si ( : ID2 != Décalage ( : ID2 , 1 ) | Rangée () == 1 , 1 , Décalage ( : Répéter , 1 ) + 1 ) )
) ;
: Répéter << Supprimer la formule ; // plus rapide que 'pour chaque ligne()'
// Diviser
dt2 = dt1 << Diviser (
Divisé par ( : ID2 ) ,
Diviser ( : Valeur ) ,
Groupe ( : IDENTIFIANT , : Répéter )
) ;
// Supprime un auxiliaire colonne
dt2 << supprimerColonne ( : Répéter ) ;
Re : Problème de division de table de donnéesSalut Sébastien Hoffmeister ,
essaye ça:
dt = Nouveau tableau ( "Données originales" ,
Ajouter des lignes ( 16 ) ,
Nouvelle colonne ( "IDENTIFIANT" ,
Numérique ,
Continu ,
Format ( "Meilleur" , 12 ) ,
Définir les valeurs ( [ 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 ] )
) ,
Nouvelle colonne ( "ID2" ,
Personnage ,
Nominal ,
Définir des valeurs (
{ "UN" , "B" , "C" , "D" , "UN" , "B" , "C" , "C" , "UN" , "B" , "C" , "D" , "UN" , "B" ,
"C" , "C" }
)
) ,
Nouvelle colonne ( "Valeur" ,
Numérique ,
Continu ,
Format ( "Meilleur" , 12 ) ,
Définir les valeurs (
[ 111 , 222 , 333 , 444 , 111 , 222 , 333 , 555 , 111 , 222 , 555 , 444 , 111 , 222 ,
555 , 666 ]
)
)
) ;
// le tableau doit être trié pour que la formule de l'étape suivante fonctionne
dt << Trier ( Remplacer le tableau ,
Par ( : IDENTIFIANT , : ID2 ) ,
Commande ( Ascendant , Ascendant )
) ;
// introduit un nouvel index qui reconnaîtra les duplications
dt << nouvelle colonne ( "ID3" ) ;
pour chaque ligne ( Si ( // n'utilise pas de formule dans la colonne car elle dépend d'un tri qui peut changer ultérieurement.
Rangée () == 1 , ID3 = : IDENTIFIANT ,
: IDENTIFIANT != Décalage ( : IDENTIFIANT , 1 ) | : ID2 != Décalage ( : ID2 , 1 ) , ID3 = : IDENTIFIANT ,
ID3 = Décalage ( : ID3 , 1 ) + 1
)) ;
// tu peux maintenant diviser la table
trié = dt << Diviser (
Divisé par ( : ID2 ) ,
Diviser ( : Valeur ) ,
Groupe ( : ID3 , : IDENTIFIANT ) ,
Tableau de sortie ( "table divisée" )
) ;
meilleur,
Ron
Re : Problème de division de table de donnéesOops! Désolé, oui Sébastien. Peut-être quelque chose comme ça ?
// Ajout d'une colonne auxiliaire
Attendez ( 3 ) ;
dt1 << Nouvelle colonne ( "Répéter" ,
Numérique ,
"Nominal" ,
Format ( "Meilleur" , 12 ) ,
Formule ( Si ( : ID2 != Décalage ( : ID2 , 1 ) | Rangée () == 1 , 1 , Décalage ( : Répéter , 1 ) + 1 ) )
) ;
Re : Problème de division de table de donnéesMerci pour le soutien Ian!
C'était plus ou moins ce que je faisais. Le problème dans le monde réel est bien sûr que l'ensemble de données comporte environ 3 000 lignes et je ne pouvais pas imaginer une formule pour créer la colonne de répétition automatiquement plutôt que manuellement.
Connaissez-vous également une solution pour cela ? Je voudrais éviter d'écrire un script qui imbrique plusieurs boucles for pour générer la colonne "répéter". Cela semble tellement inefficace.
Merci,
Sébastien
Re : Problème de division de table de donnéesJe pense que tu as besoin d'une colonne auxiliaire, Sebastian.
NomsDefaultToHere ( 1 ) ;
// Tableau
dt1 = Nouveau tableau ( "Sébastien" ,
Ajouter des lignes ( 16 ) ,
Nouvelle colonne ( "IDENTIFIANT" ,
Numérique ,
"Nominal" ,
Format ( "Meilleur" , 12 ) ,
Définir les valeurs ( [ 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 ] )
) ,
Nouvelle colonne ( "ID2" ,
Personnage ,
"Nominal" ,
Définir les valeurs (
{ "UN" , "B" , "C" , "D" , "UN" , "B" , "C" , "C" , "UN" , "B" , "C" , "D" , "UN" , "B" ,
"C" , "C" }
)
) ,
Nouvelle colonne ( "Valeur" ,
Numérique ,
"Nominal" ,
Format ( "Meilleur" , 12 ) ,
Définir les valeurs (
[ 111 , 222 , 333 , 444 , 111 , 222 , 333 , 555 , 111 , 222 , 555 , 444 , 111 , 222 ,
555 , 666 ]
)
)
) ;
// Ajout d'une colonne auxiliaire
Attendez ( 3 ) ;
dt1 << Nouvelle colonne ( "Répéter" ,
Numérique ,
"Nominal" ,
Format ( "Meilleur" , 12 ) ,
Définir les valeurs ( [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 ] )
) ;
// Diviser
dt2 = dt1 << Diviser (
Divisé par ( : ID2 ) ,
Diviser ( : Valeur ) ,
Groupe ( : IDENTIFIANT , : Répéter )
) ;
// Supprime la colonne auxiliaire
Attendez ( 3 ) ;
dt2 << supprimerColonne ( : Répéter ) ;