Résumé avec String_AggregationSALUT,
Comment coder une table qui :
- regroupés en fonction des personnages et
- construire les cellules correspondantes avec conact_items (par exemple séparées par ,).
- comme le code SQL "SELECT sex, String_Agg(Name,', ') as ConcatName FROM 'Big Class'" GROUP BY sex
Je sais que cela serait possible avec le bouclage mais je me demandais s'il existe une autre manière plus élégante.
Basé sur le tableau « Big Class », le résultat devrait ressembler à ceci :
sexe ConcatName
f KATIE, LOUISE, ....
m TIM, JAMES, ...
Merci beaucoup
Accès aux donnéesRe : Résumé avec String_AggregationMerci Jeff,
votre solution fonctionne également rapidement et je n'étais pas non plus au courant de la commande Subset(by()).
Re : Résumé avec String_AggregationMerci madame,
c'est un moyen très rapide. Je l'ai essayé en me basant sur un énorme LogFile et cela fonctionne en quelques secondes !
Re : Résumé avec String_AggregationMerci,
J'ai essayé votre approche avec quelques tables et toutes fonctionnent. Parfois, cela prenait un peu de temps (cela dépend de la taille de la table).
Re : Résumé avec String_AggregationMerci à toutes les approches.
Tous fonctionnent bien !
Re : Résumé avec String_AggregationJe n'étais pas au courant que Subset( By()...) renvoie une liste. Peut être très utile. Merci Jeff!
/Marcus
Re : Résumé avec String_Aggregation@ih et @SP Je vous ai donné de bonnes réponses mais je travaillais déjà sur cette solution, alors j'ai pensé la poster pour montrer une autre façon de faire cela, via JSL.
Profitant de la Sous-ensemble par option dans Sous-ensemble nous pouvons obtenir une table pour chaque sous-groupe, puis obtenir les valeurs de la colonne Nom et utiliser Concater des éléments() pour construire la chaîne de noms.
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 : Résumé avec String_AggregationVoici une tentative utilisant JSL (JMP 15). Cela peut également être fait de manière interactive, en utilisant des colonnes de transformation et de combinaison.
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 : Résumé avec String_AggregationIl semble que la plate-forme de tabulation ait besoin d'une fonction de résumé de concaténation.Voici une façon d'utiliser une seule boucle sur chaque ligne d'un tableau récapitulatif :
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) ) ],
","
) )
))
);