Créer une formule : moyenne du Col A pour les lignes où le Col B est le minimum dans le groupe Col C ?Supposons que j'utilise l'ensemble de données Big Class et que je souhaite créer une nouvelle colonne pour le poids moyen de l'élève le plus petit du même âge. Comment puis-je configurer cela ?
Je sais comment faire le premier bit (trouver la taille de l'élève le plus petit du même âge) qui est juste un Col Mean avec un byVariable :
Col Minimum( :hauteur, :âge)
Mais ce que je ne sais pas comment faire, c'est ensuite prendre le poids moyen de ce sous-ensemble d'élèves où (A) l'âge de cet élève correspond à l'âge de l'élève de cette rangée, et (B) la taille de cet élève correspond à la taille la plus courte pour les étudiants de leur âge.
Mélange et nettoyage des donnéesRe : Créer une formule : moyenne du Col A pour les lignes où le Col B est le minimum dans le groupe Col C ?Fantastique, merci ! Vous apprenez deux nouvelles choses chaque jour 
Pour combiner vos formules Cars en une seule colonne, cela ressemble à ceci :
:Size[Col Max( If( :Wt == Col Max( :Wt, :Make ), Row(), . ), :Make )]
Re : Créer une formule : moyenne du Col A pour les lignes où le Col B est le minimum dans le groupe Col C ?J'ai joint un tableau de données avec des formules un peu différentes et divisé en plusieurs (mes précédentes pour les voitures auraient pu avoir des problèmes en raison du regroupement pour des poids non maximaux). Cela vous permettra également de voir ce qui se passe s’il y a des égalités.
:Size[idx] vous permet d'accéder à la valeur dans la colonne :Size avec l'idx spécifié, vous pouvez également accéder à plusieurs avec :Size[[1,2,3]] par exemple (cela pourrait aider un peu Inscription aux tables de données )
Exécutez ceci dans la fenêtre de script, jetez un œil au journal et comparez-le à datatable :
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Show(dt:name[1]);
Show(dt:name[5]);
Show(dt:name[10]);
Show(dt:name[[10, 11]]);
Show(dt:name[10::15]);Re : Créer une formule : moyenne du Col A pour les lignes où le Col B est le minimum dans le groupe Col C ?Merci @jthi , ça marche à merveille !
Pour être sûr de bien comprendre, il semble que l'instruction If crée une colonne "virtuelle" qui annule toutes les lignes dont la hauteur n'est pas la hauteur minimale pour cet âge, puis utilise Col Mean pour opérer sur cette colonne "virtuelle". Joli tour!
Il ne me semble pas que la formule de l'exemple Cars fonctionne - par exemple, la formule renvoie "pu" pour Chevrolet même si la Chevrolet la plus lourde (la Suburban) est "mpv", et renvoie "med" pour Chrysler même si la Chrysler la plus lourde (la Cinquième Ave) est "hev". Quoi qu'il en soit, pour ma candidature, vous avez déjà résolu le problème avec votre formule de Big Class - mais, juste par curiosité et pour approfondir mon JMP-fu, je suis curieux d'en savoir plus sur ce qui se passe dans la formule finale. Que fait l'opérateur crochet, par exemple ":Size[...]" ?
Re : Créer une formule : moyenne du Col A pour les lignes où le Col B est le minimum dans le groupe Col C ?Vous pouvez le faire avec une formule (obtention de la moyenne des poids minimum par tranche d'âge) :
Col Mean(If(:height == Col Min(:height, :age), :weight, .), :age)
Divisez la formule en deux formules différentes pour la rendre un peu plus facile à comprendre :
Valeurs de poids minimum :
If(:height == Col Min(:height, :age),
:weight,
.
)
et puis moyenne de cette valeur :
Col Mean(:MinWeightVal, :age)
Col Mean ignorera les valeurs manquantes, donc cela devrait fonctionner
Avec les voitures (je ne sais pas exactement à quoi vous voulez que les données ressemblent :
Poids maximum pour la marque :
Col Max(:Wt, :Make)
Taille en fonction du poids si vous souhaitez une seule rangée :
If(:Wt == :Max Wt for Make,:Size,"")
Même valeur pour plusieurs lignes, vous pouvez très probablement supprimer certaines fonctions Col à partir de là, mais c'est le plus simple que j'ai trouvé rapidement :
:Size[Col Max(Col Max(Row(), If(:Wt == Col Max(:Wt, :Make), 1, 0), :Make), :Make)]
crachez dans plusieurs formules différentes pour voir comment cela fonctionne
Re : Créer une formule : moyenne du Col A pour les lignes où le Col B est le minimum dans le groupe Col C ?Salut @markschwab ,
si vous pouvez vous permettre de trier le tableau, essayez ceci :
Names default to here (1);
// Open Data Table: Cars.jmp
dt = Open( "$SAMPLE_DATA/Cars.jmp" );
// Sort data table
dt << Sort( By( :Make, :Wt ), Replace Table, Order( Ascending, Descending ) );
// New column: Size of Max Wt for Make<BR />dt << New Column( "Size of Max Wt for Make",<BR />Character,<BR />"Nominal",<BR />Formula( If( Row() == 1, :Size, :Make == Lag( :Make ), Lag( :Size of Max Wt for Make ), :Make != Lag( :Make ), :Size ) )<BR />);<BR />
à présent, j'aimerais également connaître la solution de formule directe sans trier.
si vous devez utiliser les données plus tard, supprimez simplement la formule ou supprimez l'évaluation.
Re : Créer une formule : moyenne du Col A pour les lignes où le Col B est le minimum dans le groupe Col C ?Merci Ron. Je pense que cela pourrait fonctionner pour moi (même si ce serait bien de pouvoir le faire dans la même fiche technique.)
Pour, espérons-le, rendre les choses plus faciles, ce serait bien pour mon application actuelle d'utiliser une recherche au lieu d'une moyenne - la colonne dont je prendrai le maximum est un horodatage, et nous pouvons supposer qu'il y a une ligne unique pour chaque groupe avec le horodatage le plus récent.
Ainsi, par exemple, en utilisant l'ensemble de données Cars, mon problème serait :
Créez une colonne « Taille du poids maximum pour la marque » qui trouve la voiture avec le poids le plus élevé parmi toutes les voitures de la même marque, puis recherche la taille de cette voiture au poids maximum.
Re : Créer une formule : moyenne du Col A pour les lignes où le Col B est le minimum dans le groupe Col C ?Salut @markschwab ,
jusqu'à ce que quelqu'un nous montre la manière élégante d'utiliser une formule de colonne, vous pouvez essayer ce qui suit :
names default to here (1);
// Open Data Table: Big Class.jmp
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// New column: min height 0/1
dt<< New Column( "min height",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( If( :height == Col Min( :height, :age ), 1 ) )
);
// Data table summary
// → Data Table( "Big Class By (age, Min height)" )
dt2 = dt << Summary(
Group( :age, :Min height ),
Mean( :weight ),
Freq( "None" ),
Weight( "None" ),
Link to original data table( 0 )
);
// Delete selected rows
dt2 <<
Select Where( Is Missing( :Min height ) ) << Delete Rows;
// Update data tables
dt << Update(
With( dt2 ),
Match Columns( :age = :age ),
Replace Columns in Main Table(:"Mean(weight)"n )
);
une formule serait plus sympa puisqu'elle se mettra également à jour automatiquement.
faites-nous savoir si cela aide.
Ron