Salut,
J'ai des données avec environ 5000 lignes.
Il y a trois colonnes (Groupe, Score et Compte)
Valeur pour le groupe : A, B
Valeur du score comprise entre 0,5 et 1
La valeur de Count est 1 pour chaque ligne.

Je voudrais résumer les données par groupe A et B et regrouper la valeur du score dans quelques catégories, puis additionner le nombre pour chaque catégorie de score, comme ci-dessous.

Je cherche de l'aide auprès de la communauté pour créer un script JSL pour effectuer cette tâche ?
Je joins également des données ici.
Merci
Voici quelques façons de procéder.Mais étant donné que l'exemple ci-dessous est vraiment basé sur la fonctionnalité principale de JMP, je vous suggère fortement de lire les documents Découverte de JMP et Utilisation de JMP, de la bibliothèque de documentation JMP, disponibles dans le menu déroulant Aide.
Names Default To Here( 1 );
dt = Current Data Table();
dt << New Column( "Score Category",
character,
formula(
If(
:Score < .6, "0.50-0.59",
:Score < .8, "0.60-0.79",
:Score < .9, "0.80-0.89",
"0.90-1.00",
)
)
);
dtSum = dt << Summary(
Group( :Group, :Score Category ),
Sum( :Count ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 )
);
dtSum << delete columns( :N Rows );
dtSum:Name( "Sum(Count)" ) << set name( "Total_Count" );
// or
dt:score << set property(
"value labels",
{0.5 <= "0.50-0.59" < 0.6, 0.6 <= "0.60-0.79" < 0.8, 0.8 <= "0.80-0.89" < 0.9, 0.9
<= "0.90-1.00" <= 1}
);
dtSum = dt << Summary(
Group( :Group, :Score ),
Sum( :Count ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 )
);
dtSum << delete columns( :N Rows );
dtSum:Name( "Sum(Count)" ) << set name( "Total_Count" );J'utiliserais une approche interactive pour capturer un script pour cela. Commençons d'abord par le tableau de données :

J'ai laissé Count off parce que nous n'en aurons pas besoin mais ça ne fera pas de mal si c'est là.
J'ai sélectionné la colonne Score, puis j'ai navigué vers Cols, Utilities, Make Binning Formula :

Et réglez Offset sur 0,5 et bin width sur 0,1 :

Faites un clic droit sur la nouvelle colonne (Score Binned) et Copiez les propriétés de la colonne :

Ouvrez ensuite une nouvelle fenêtre de script et collez (ctrl-V), ce qui donne ce JSL :
Add Column Properties(
Value Labels(
{-0.5 = "-0.5 — -0.4", -0.4 = "-0.4 — -0.3", -0.3 = "-0.3 — -0.2", -0.2 =
"-0.2 — -0.1", -0.1 = "-0.1 — 0", 0 = "0 — 0.1", 0.1 = "0.1 — 0.2", 0.2 =
"0.2 — 0.3", 0.3 = "0.3 — 0.4", 0.4 = "0.4 — 0.5", 0.5 = "0.5 — 0.6", 0.6 =
"0.6 — 0.7", 0.7 = "0.7 — 0.8", 0.8 = "0.8 — 0.9", 0.9 = "0.9 — 1", 1 =
"1 — 1.1", 1.1 = "1.1 — 1.2", 1.2 = "1.2 — 1.3", 1.3 = "1.3 — 1.4", 1.4 =
"1.4 — 1.5", 1.5 = "1.5 — 1.6", 1.6 = "1.6 — 1.7", 1.7 = "1.7 — 1.8", 1.8 =
"1.8 — 1.9", 1.9 = "1.9 — 2"}
),
Use Value Labels( 1 ),
Formula( 0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 ) )
)Deux choses ici : nous ne nous soucions pas des scores inférieurs à 0,5 (ils n'existent pas dans votre description) ou supérieurs à 1, nous pouvons donc modifier un peu les propriétés et modifier les noms des étiquettes pour qu'ils correspondent à ce que vous voulez. J'ai également ajouté une instruction If pour capturer le cas limite où un score est exactement 1
Add Column Properties(
Value Labels(
{0.5 = "0.5 — 0.59", 0.6 = "0.6 — 0.69", 0.7 = "0.7 — 0.79", 0.8 = "0.8 — 0.89", 0.9 =
"0.9 — 1"}
),
Use Value Labels( 1 ),
Formula(
If(
(0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )) == 1, 0.9,
0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )
)
)
);(BTW ces étiquettes ne sont pas techniquement exactes, puisque 0,599 serait étiqueté entre 0,5 et 0,59)
Nous pouvons envelopper du code autour de cet extrait pour le rendre réutilisable, où nous utilisons la table de données actuelle, ajouter une nouvelle colonne appelée Score Binned et ajouter ces propriétés à cette colonne :
dt = Current Data Table();
dt << New Column("Score Binned", Character);
dt:"Score Binned"n << Add Column Properties(
Value Labels(
{0.5 = "0.5 — 0.59", 0.6 = "0.6 — 0.69", 0.7 = "0.7 — 0.79", 0.8 = "0.8 — 0.89", 0.9 =
"0.9 — 1"}
),
Use Value Labels( 1 ),
Formula(
If(
(0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )) == 1, 0.9,
0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )
)
)
);Maintenant, de retour sur notre table, Tables > Résumé nous emmène là où nous voulons aller. Nous mettons Group et Score Binned dans Group, et c'est tout ce dont nous avons réellement besoin :


Maintenant, N Rows est ce que nous voulons, c'est juste qu'il est mal nommé, alors double-cliquons sur le mot "Source" à gauche et copions le script de création de table et remplaçons la référence de table nommée par "dt", notre table de travail, et attrapons la nouvelle table dans la variable "summ":

dt = Current Data Table();
dt << New Column("Score Binned", Character);
dt:"Score Binned"n << Add Column Properties(
Value Labels(
{0.5 = "0.5 — 0.59", 0.6 = "0.6 — 0.69", 0.7 = "0.7 — 0.79", 0.8 = "0.8 — 0.89", 0.9 =
"0.9 — 1"}
),
Use Value Labels( 1 ),
Formula(
If(
(0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )) == 1, 0.9,
0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )
)
)
);
summ = dt << Summary(
Group( :Group, :Score Binned ),
Freq( "None" ),
Weight( "None" )
);Enfin, renommez N Rows en "Total_Count" comme vous le souhaitez :
dt = Current Data Table();
dt << New Column("Score Binned", Character);
dt:"Score Binned"n << Add Column Properties(
Value Labels(
{0.5 = "0.5 — 0.59", 0.6 = "0.6 — 0.69", 0.7 = "0.7 — 0.79", 0.8 = "0.8 — 0.89", 0.9 =
"0.9 — 1"}
),
Use Value Labels( 1 ),
Formula(
If(
(0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )) == 1, 0.9,
0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )
)
)
);
summ = dt << Summary(
Group( :Group, :Score Binned ),
Freq( "None" ),
Weight( "None" )
);
summ:"N Rows"n << Set Name("Total_Count");Maintenant, fermez la table récapitulative, supprimez la colonne Score Binned de la table source et testez le script :

Final JSL à nouveau :
dt = Current Data Table();
dt << New Column("Score Binned", Character);
dt:"Score Binned"n << Add Column Properties(
Value Labels(
{0.5 = "0.5 — 0.59", 0.6 = "0.6 — 0.69", 0.7 = "0.7 — 0.79", 0.8 = "0.8 — 0.89", 0.9 =
"0.9 — 1"}
),
Use Value Labels( 1 ),
Formula(
If(
(0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )) == 1, 0.9,
0.5 + 0.1 * Floor( (:Score - 0.5) / 0.1 )
)
)
);
summ = dt << Summary(
Group( :Group, :Score Binned ),
Freq( "None" ),
Weight( "None" )
);
summ:"N Rows"n << Set Name("Total_Count");Testé sur vos données jointes, que je viens littéralement de remarquer :flushed_face:
