den Modus finden<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hallo allerseits,
Ich möchte eine Übersichtstabelle erstellen, die den Modus einer Variablen für jede Kategorie einer anderen Variablen angibt.
Im Idealfall würde das funktionieren:
dt = open ("$SAMPLE_DATA/Mail Messages.jmp");
dt << Zusammenfassung ( Group ( :From ), Mode (:To) );
Alternativ würde ich die Tabelle nach „Von“ stapeln und den Modus in jeder Zeile berechnen. Dennoch ist „Modus“ in der Tabellenzusammenfassung oder Spaltenformel keine Option.
Alle Ideen zur Berechnung des Modus sind willkommen, auch beim Senden an SAS.
Ich verwende JMP 10.
Danke,
Ron
Betreff: Den Modus findenHallo-der Modus ist das häufigste Element,Sie suchen also nach der Person ( oder vermutlich nach Personen, wenn es ein Unentschieden gibt ) , die von jedem Absender die meisten Briefe erhalten hat,ist das richtig? Wenn ja,Ich denke, das Folgende sollte ausreichen, obwohl ich keinen Zweifel daran habe, dass es einen viel eleganteren und/oder kürzeren Weg gibt. Ich habe alle Zwischenberechnungen bewusst weggelassen,und alle Tabellen benannt, um einen Prüfpfad zu hinterlassen:
dt1= offen ("$SAMPLE_DATA/Mail Messages.jmp");
dt1<<Setname ("dt1");
dt2=dt1<<Zusammenfassung ( Gruppe (:Aus ), N,Untergruppe (:Zu ) );
dt2<<Setname ("dt2");
Gesendet von=( dt2<<Spaltennamen abrufen );
zeigen(Gesendet von );
// Die ersten beiden Elemente dieser Liste wegwerfen;
entfernen von(Gesendet von, {1, 2});
zeigen(Gesendet von );
// Stapeln Sie sie;
dt3=dt2<<Stapel ( Spalten (Auswertung(Gesendet von )), Spalte „Quellenbezeichnung “ ("Etikett" ), Gestapelte Datenspalte ("Daten" ));
dt3<<Setname ("dt3");
// dt3 enthält jetzt die Anzahl der von jeder Person an jeden Empfänger gesendeten Briefe;
dt4=dt3<<Zusammenfassung ( Gruppe (:Aus ), Max( :Daten ) );
dt4<<Setname ("dt4");
// dt4 enthält jetzt die maximale Anzahl von Briefen, die von jeder Person an einen bestimmten Empfänger gesendet werden;
dt5=dt4<<Verbinden ( Mit ( dt3 ),
SelectWith ( : Von ,: Bezeichnung ,: Daten ) ,
Durch übereinstimmende Spalten (:Aus= :Aus, :Name ("Max(Daten)" ) = :Daten ),
Vielfache löschen (0, 0 ),
Name ( "Nichtübereinstimmungen einschließen" ) ( 0 , 0 ) ,
Haupttabellenreihenfolge beibehalten (1 )
);
dt5<<Setname ("dt5");
Spalte(dt5, "Etikett") <<Setname ("Empfänger");
/*
dt5 sollte nun die maximale Anzahl von Briefen enthalten, die von jeder Person an jeden Empfänger gesendet werden
und den Namen des Empfängers (oder der Empfänger im Falle eines Gleichstands)
*/
Das sollte bedeuten, dass Ann vier Briefe an Michael geschickt hat, Jeff sieben, John zwölf, Katherine zwölf usw. Möchten Sie das ausprobieren und sehen, ob es Ihren Anforderungen entspricht? Um die maximale Anzahl der Briefe zu ermitteln, die ein Empfänger von einem bestimmten Absender erhalten hat, vertauschen Sie einfach die Spalten „An“ und „Von“.
Betreff: Den Modus findenDanke, Dodo,
es funktioniert gut.
Betreff: Den Modus findenhallo Dodo und alle,
Die Lösung von Dodo ist technisch korrekt, aber beim Umgang mit Big Data nicht nützlich.
Wenn ich darüber nachdenke, habe ich eine alternative Lösung, die skalierbar ist.
dt1 = Öffnen( "$SAMPLE_DATA/Mail Messages.jmp" );
dt1 << Name festlegen( "dt1" );
// eine Verteilung der Empfänger nach Absendern erstellen
dt1 << Neues Skript( "Verteilung", Verteilung( Nominale Verteilung( Spalte( :Bis ) ), Nach( :Von ) ) );
Dist = Dt1 << Skript ausführen ("Verteilung");
// Extrahieren Sie die Häufigkeitstabellen als eine Datentabelle.
dt2 = Report( dist[1] )["Frequenzen"][Tabellenfeld( 1 )] << Kombinierte Datentabelle erstellen;
dt2 << Name festlegen( "dt2" );
dist << Fenster schließen;
// Entfernen Sie die Zeilen „Gesamt“ aus der Datentabelle – sie stellen keine relevanten Häufigkeiten dar
Auswahl = dt2 << Auswählen, wobei (:Ebene == "Gesamt");
Auswahl << Zeilen löschen;
// zusammenfassen, um den Modus „Bis“ für jedes „Von“ zu erhalten
dt3 = Datentabelle( "dt2" ) << Zusammenfassung(Gruppe( :Von ), Max( :Anzahl ), Format des Statistikspaltennamens( "Spalte" ), Link zur ursprünglichen Datentabelle( 0 ) );
dt3 << Name festlegen ("Modus");
// Aktualisieren Sie die Übersichtstabelle, um die Werte von „Bis“ zu erhalten.
dt3 << Update( With( Data Table( "dt2" ) ), Match Columns( :From = :From, :Count = :Count ), Add Columns from Update table( :Level ) );
dt2 << Fenster schließen;
Spalte (dt3, „Ebene“) << Name festlegen („Modus“);
Betreff: Den Modus findenEs gibt oft mehrere Möglichkeiten, eine Aufgabe in JMP auszuführen. Mir ist gerade eine Funktion eingefallen, die ich vor einiger Zeit geschrieben habe und die recht effizient ist, um das am häufigsten vorkommende Element gruppiert nach einer oder mehreren Spalten zu finden. Ich stelle sie hier als Alternative zu den oben genannten Ansätzen vor. Das Ergebnis ist ähnlich wie bei Dodo, d. h. es werden alle "gebundenen" Modi zurückgegeben, nicht nur der letzte wie bei Rons Ansatz mit update().
mode_by_groups = Funktion ( { collist } , // Liste der Spaltennamen
// Modus der letzten Spalte in der Kollist suchen
Zusammenfassen ( g = durch ( Bewertung ( collist ) ) , n = Anzahl () ) ;
X = Entwurf ( g [ 1 ] )
n ;
i = Ort ( V Max ( Transponieren ( X == Wiederholen ( V Max ( X ) , N Zeile ( n ) ) ) ) ) ;
//Gruppierungsspalten zur neuen Tabelle hinzufügen
dt1 = Neue Tabelle ( "Modi" ) ;
Für ( k = 1 , k <= N Elemente ( Collist ) – 1 , k ++,
dt1 << ( Neue Spalte ( verkohlen ( collist [ k ]) , Zeichen , Werte festlegen ( g [ k ][ i ] ) )) ;
);
//Modus und N hinzufügen
dt1 << Neue Spalte( "Modus von " || verkohlen(collist[k]), Character, set values( g[k][i] ) );
dt1 << Neue Spalte( "N", set values( n[i] ) );
);
//Beispiele
Öffnen ( "$SAMPLE_DATA/Mail Messages.jmp" ) ;
mode_by_groups ( { Von , Nach } ) ;
Offen ( "$SAMPLE_DATA/Consumer Preferences.jmp" ) ;
mode_by_groups ( { Geschlecht , Single-Status , Geburtsjahr } ) ;