trouver le mode<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />salut tout le monde,
je voudrais produire un tableau récapitulatif qui donne le mode d'une variable pour chaque catégorie d'une autre variable.
idéalement, cela fonctionnerait :
dt = ouvert ("$SAMPLE_DATA/Mail Messages.jmp");
dt << résumé ( Groupe ( :From ), Mode (:To) );
alternativement, j'empilerais le tableau par "De" et calculerais le mode à chaque ligne. pourtant, "Mode" n'est pas une option dans le résumé du tableau ou dans la formule de colonne.
toutes idées calculant le mode sont les bienvenues y compris en envoi à SAS.
j'utilise JMP 10.
merci,
Ron
Re: trouver le modeSalut-le mode est l'élément le plus courant,vous recherchez donc la personne ( ou probablement les personnes s'il y a égalité ) qui a reçu le plus grand nombre de lettres de chaque expéditeur,Est-ce vrai ? Si oui,Je pense que ce qui suit devrait suffire, même si je suis certain qu'il existe une méthode bien plus élégante et/ou plus courte. J'ai volontairement laissé de côté tous les calculs intermédiaires.,et nommé toutes les tables pour laisser une piste d'audit:
dt1= ouvrir (« $SAMPLE_DATA/Messages électroniques.jmp »);
dt1<<nom de l'ensemble ("dt1");
dt2=dt1<<Résumé ( Groupe (:Depuis ), N,Sous-groupe (:À ) );
dt2<<nom de l'ensemble ("dt2");
Envoyé de=( dt2<<obtenir les noms des colonnes );
montrer(Envoyé de );
// Jetez les deux premiers éléments de cette liste ;
retirer de(Envoyé de, {1, 2});
montrer(Envoyé de );
// Empilez-les ;
dt3=dt2<<Pile ( colonnes (évaluer(Envoyé de )), Colonne d'étiquette source ("Étiquette" ), Colonne de données empilées ("Données" ));
dt3<<nom de l'ensemble ("dt3");
// dt3 contient désormais le nombre de lettres envoyées par chaque personne à chaque destinataire ;
dt4=dt3<<Résumé ( Groupe (:Depuis ), Max( :Données ) );
dt4<<nom de l'ensemble ("dt4");
// dt4 contient désormais le nombre maximum de lettres envoyées par chaque personne à un destinataire ;
dt5=dt4<<Rejoindre ( Avec ( dt3 ),
SelectWith ( : De , : Étiquette , : Données ) ,
En faisant correspondre les colonnes (:Depuis= :Depuis, :Nom ("Max(Données)" ) = :Données ),
Déposer des multiples (0, 0 ),
Nom ( "Inclure les non-correspondances" )( 0 , 0 ) ,
Conserver l'ordre de la table principale (1 )
);
dt5<<nom de l'ensemble ("dt5");
colonne(dt5, "Étiquette") <<nom de l'ensemble ("Destinataire");
/*
dt5 devrait désormais contenir le nombre maximum de lettres envoyées par chaque personne à n'importe quel destinataire
et le nom de ce destinataire (ou des destinataires en cas d'égalité)
*/
Cela devrait vous donner qu'Ann a envoyé 4 lettres à Michael, Jeff 7 lettres à Michael, John 12 lettres à Michael, Katherine 12 lettres à John, et ainsi de suite. Voulez-vous tester cela et voir si cela répond à vos besoins ? Pour obtenir le nombre maximal de lettres reçues par un destinataire d'un même expéditeur, il suffit d'inverser les colonnes :À et :De.
Re: trouver le modeMerci Dodo,
ça marche bien.
Re: trouver le modeSalut Dodo et tous,
La solution de Dodo est techniquement correcte mais n’est pas utile lorsqu’il s’agit de traiter des données volumineuses.
En y réfléchissant, j'ai une solution alternative qui est évolutive.
dt1 = Open( "$SAMPLE_DATA/Mail Messages.jmp" );
dt1 << définir le nom( "dt1" );
// produire une distribution de réverseurs par expéditeurs
dt1 << Nouveau script( "Distribution", Distribution( Distribution nominale( Colonne( :À ) ), Par( :De ) ) );
Dist = Dt1 << Exécuter le script( "Distribution" );
// extraire les tables de fréquences en une seule table de données.
dt2 = Rapport( dist[1] )["Fréquences"][Table Box( 1 )] << Créer un tableau de données combiné ;
dt2 << définir le nom( "dt2" );
dist << fermer la fenêtre ;
// supprimez les lignes « Total » du tableau de données - elles ne représentent pas les fréquences pertinentes
sélection = dt2 << Sélectionner Où( :Level == "Total" );
sélection << Supprimer les lignes ;
// résumer pour obtenir le mode « À » pour chaque « De »
dt3 = Data Table( "dt2" ) << Summary( Group( :From ), Max( :Count ), format du nom de la colonne de statistiques( "column" ), Lien vers la table de données d'origine( 0 ) );
dt3 << Définir le nom( "Mode" );
// mettre à jour le tableau récapitulatif pour obtenir les valeurs de « À »
dt3 << Mettre à jour(Avec(Tableau de données("dt2" ) ), Correspondance des colonnes( :From = :From, :Count = :Count ), Ajouter des colonnes à partir du tableau de mise à jour( :Level ) );
dt2 << fermer la fenêtre ;
Colonne( dt3, "Niveau" ) << Définir le nom( "Mode" );
Re: trouver le modeIl existe souvent plusieurs façons d'effectuer une tâche dans JMP. Je viens de me rappeler une fonction que j'ai écrite il y a quelque temps et qui est très efficace pour trouver l'élément le plus courant groupé par une ou plusieurs colonnes. Je la partage ici comme alternative aux approches précédentes. Le résultat est similaire à celui de Dodo : tous les modes « liés » sont renvoyés, et pas seulement le dernier comme dans l'approche de Ron utilisant update().
mode_by_groups = Fonction ( { collist } , // liste des noms de colonnes
// Trouver le mode de la dernière colonne dans collist
Résumer ( g = par ( Évaluer ( colliste ) ) , n = Compter () ) ;
X = Conception ( g [ 1 ] )
n ;
i = Lieu ( V Max ( Transposer ( X == Répéter ( V Max ( X ) , N Ligne ( n ) ) ) ) ) ;
//Ajouter des colonnes de regroupement à la nouvelle table
dt1 = Nouvelle table ( "modes" ) ;
Pour ( k = 1 , k <= N éléments ( colliste ) - 1 , k ++,
dt1 << ( Nouvelle colonne ( carboniser ( colliste [ k ] ) , Caractère , définir les valeurs ( g [ k ][ i ] ) )) ;
);
//Ajouter le mode et N
dt1 << Nouvelle colonne ( "Mode de " || carboniser ( colliste [ k ] ) , Caractère , définir les valeurs ( g [ k ][ i ] ) ) ;
dt1 << Nouvelle colonne( "N", set values( n[i] ) );
);
//Exemples
Ouvrir ( "$SAMPLE_DATA/Mail Messages.jmp" ) ;
mode_by_groups ( { De , À } ) ;
Ouvrir( "$SAMPLE_DATA/Consumer Preferences.jmp" );
mode_by_groups ( { Sexe , Statut célibataire , Année de naissance } ) ;