Resumen con String_AggregationHOLA,
¿Cómo puedo codificar una tabla que:
- agrupados según personajes y
- construir las celdas correspondientes con conact_items (por ejemplo, separadas con ,).
- como el código SQL "SELECT sex, String_Agg(Name,', ') as ConcatName FROM 'Big Class'" GROUP BY sex
Sé que esto sería posible con el bucle, pero me preguntaba si hay otra forma más elegante.
Según la tabla "Big Class", el resultado debería verse así:
sexo NombreConcat
f KATIE, LOUISE, ....
m TIM, JAMES, ...
Muchas gracias
Acceso a los datosRe: Resumen con String_AggregationParece que la plataforma tabulada necesita una función de resumen de concatenación.Aquí hay una forma de usar un solo bucle en cada fila de una tabla de resumen:
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) ) ],
","
) )
))
);
Re: Resumen con String_AggregationAquí hay un intento de usar JSL (JMP 15). También se puede hacer de forma interactiva, utilizando columnas de transformación y combinación.
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: Resumen con String_Aggregation@ih y @Sra Le he dado buenas respuestas, pero ya estaba trabajando en esta solución, así que pensé en publicarla para mostrar otra forma de hacerlo, a través de JSL.
Aprovechando la Subconjunto por opción en Subconjunto podemos obtener una tabla para cada subgrupo, y luego obtener los valores de la columna Nombre y usar Elementos de Concat () para construir la cadena de nombres.
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();