Zusammenfassung mit String_AggregationHALLO,
Wie kann ich eine Tabelle codieren, die:
- gruppiert nach Zeichen und
- Erstellen Sie die entsprechenden Zellen mit conact_items (z. B. getrennt mit ,).
- wie der SQL-Code „SELECT sex, String_Agg(Name,', ') as ConcatName FROM 'Big Class'“ GROUP BY sex
Ich weiß, dass dies mit einer Schleife möglich wäre, aber ich habe mich gefragt, ob es einen anderen und eleganteren Weg gibt.
Basierend auf der Tabelle „Big Class“ sollte das Ergebnis so aussehen:
Geschlecht ConcatName
f KATIE, LOUISE, ....
m TIM, JAMES, ...
Vielen Dank
DatenzugriffRe: Zusammenfassung mit String_AggregationDanke Jeff,
Ihre Lösung funktioniert auch schnell und der Befehl Subset (by ()) war mir auch nicht bekannt.
Re: Zusammenfassung mit String_AggregationDanke ms,
Dies ist ein sehr schneller Weg. Ich habe es anhand einer riesigen Logdatei ausprobiert und es funktioniert in Sekunden!
Re: Zusammenfassung mit String_AggregationDanke eh,
Ich habe Ihren Ansatz mit einigen Tabellen ausprobiert und alle funktionieren. Manchmal hat es etwas gedauert (abhängig von der Tischgröße).
Re: Zusammenfassung mit String_AggregationDanke an alle Ansätze.
Alle arbeiten gut!
Re: Zusammenfassung mit String_AggregationMir war nicht bewusst, dass Subset(By()...) eine Liste zurückgibt. Kann sehr nützlich sein. Danke Jeff!
/Marcus
Re: Zusammenfassung mit String_Aggregation@ich h Und @MS habe Ihnen gute Antworten gegeben, aber ich habe bereits an dieser Lösung gearbeitet, also dachte ich, ich würde sie posten, um eine andere Möglichkeit zu zeigen, dies über JSL zu tun.
Unter Ausnutzung der Teilmenge von Möglichkeit ein Teilmenge Wir können eine Tabelle für jede Untergruppe erhalten und dann die Werte aus der Spalte Name abrufen und verwenden Concat-Artikel () um die Namenskette aufzubauen.
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt_list = dt << Subset(
By( :sex ),
All rows,
Selected columns only( 0 ),
columns( :name, :age, :height, :weight ),
private
);
nt = New Table();
group_col_name = Word( 1, dt_list[1] << get name, "=" );
nt << New Column( group_col_name, character );
nt << New Column( "concat name" );
nt << add rows( N Items( dt_list ) );
For( i = 1, i <= N Items( dt_list ), i++,
Column( nt, group_col_name )[i] = Word( 2, dt_list[i] << get name, "= " );
nt:concat name[i] = Concat Items( dt_list[i]:name << get values, ", " );
);
For( i = 1, i <= N Items( dt_list ), i++,
Close( dt_list[1], nosave )
);
dt_list = Empty();
Re: Zusammenfassung mit String_AggregationHier ist ein Versuch mit JSL (JMP 15). Dies kann auch interaktiv erfolgen, indem Spalten transformiert und kombiniert werden.
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt1 = dt << Transpose( columns( :name ), By( :sex ), Output Table( "Test" ) );
dt1 << Combine Columns(
delimiter( ", " ),
Columns( 3 :: N Col( dt1 ) ),
Selected Columns are Indicator Columns( 0 ),
Column Name( "ConcatName" )
) << deletecolumns( 2, 4 :: N Col( dt1 ) );
Re: Zusammenfassung mit String_AggregationEs scheint, als ob die tabellarische Plattform eine verkettete Zusammenfassungsfunktion benötigt.Hier ist eine Möglichkeit, eine einzelne Schleife in jeder Zeile einer Übersichtstabelle zu verwenden:
Names default to here(1);
dt = Open("$Sample_data/big class.jmp");
//Table with each unique sex and count
dtSum = (dt << Tabulate(
Add Table( Row Table( Grouping Columns( :sex ) ) )
)) << Make Into Data Table;
//blank column for concatenated names
dtSum << New Column("Names", Character, "Nominal");
//loop for each row/sex
for each row(dtSum,
// Use Eval and eval expression to insert the sex of the current
// row into the where expression of the other table
Eval(Eval Expr(
//fill in the names one row at a time, joining all values together
:Names = char( Concat Items(
//get names from main table matching the sex of the summary table
dt:name[ dt << Get Rows Where( dt:sex == Expr(:sex) ) ],
","
) )
))
);