¿Cómo puedo obtener la suma de todas las diferentes combinaciones de un grupo de columnas?Hola,
Estoy usando JMP PRO v16
Tengo un grupo de 10 columnas con valores numéricos y quiero intentar obtener una suma de las puntuaciones en todas las combinaciones posibles entre estas 10 columnas (p. ej., columna A+ columna B, columna A+ columna B + columna C, columna B + columna C y así sucesivamente).
Muchas gracias por tu ayuda
Automatización y secuencias de comandosRe: ¿Cómo puedo obtener la suma de todas las diferentes combinaciones de un grupo de columnas?Hola @DivisiveFerret8 .,
No conozco una forma rápida de hacer esto de forma interactiva en JMP, pero con algo de jsl podemos hacer esas columnas rápidamente:
Names Default to Here (1);
dt = Current Data Table();
// Get the number of columns
ncols = N Col( dt );
// Nested loop to go through all pairwise combinations of columns
For( i = 1, i < ncols, i++,
For( j = i + 1, j <= ncols, j++,
colName1 = Column( dt, i ) << get name;
colName2 = Column( dt, j ) << get name;
// create new column
newColName = colName1 || " + " || colName2;
dt << New Column( newColName, Numeric, "Continuous", Format( "Best", 12 ) );
// compute the sum
Column( dt, newColName ) << set each value(
Column( dt, colName1 )[Row()] + Column( dt, colName2 )[Row()]
);
)
);
//EDITAR//
El código anterior es para todas las combinaciones de columnas en la tabla, pero ahora veo que estabas preguntando sobre un grupo de columnas:
Names Default to Here (1);<BR />dt = Current Data Table();
// List of specific columns
// columns = {"Column A", "Column B", "Column C", "Column D", "Column E", "Column F", "Column G", "Column H", "Column I", "Column J"};
// Using selected columns
// columns = dt << Get Selected Columns;
// Referencing by Group Name
columns = dt << get column group( "XY" );
// Number of specific columns
ncols = N Items( columns );
// Nested loop to go through all pairwise combinations of specified columns
For( i = 1, i < ncols, i++,
For( j = i + 1, j <= ncols, j++,
colName1 = columns[i]<<GET name=""></GET>
Dejé algunas otras opciones allí, como una lista de columnas específicas o usar columnas seleccionadas.
¡Espero que esto ayude!
@Julian
Re: ¿Cómo puedo obtener la suma de todas las diferentes combinaciones de un grupo de columnas?¡Muchas gracias! Creo que este script solo produce combinaciones por pares, ¿hay alguna forma de tener todas las combinaciones posibles? (es decir, todas las combinaciones posibles de 2, 3, 4, 5, 6, 7, 8 y 9 columnas),
Gracias de nuevo por tu ayuda,
Re: ¿Cómo puedo obtener la suma de todas las diferentes combinaciones de un grupo de columnas?Realmente no tengo claro cuál debe ser exactamente el resultado final.Sin embargo, a continuación hay un script que resume todas las combinaciones de columnas para una tabla de datos que tiene 7 (no 10, pero funcionará con 10) columnas numéricas.Crea una nueva tabla con la suma de cada una de las combinaciones de columnas que se están creando.

Names Default To Here( 1 );
dt =
// Open Data Table: Blood Pressure.jmp
// → Data Table( "Blood Pressure" )
Open( "$SAMPLE_DATA/Blood Pressure.jmp" );
startCol = 3;
endCol = N Col( dt ) - startCol - 1;
colNames = dt << get column names( string );
Remove From( colNames, 1, startCol - 1 );
dtOutput = New Table( "output", New Column( "Columns Used", character ), New Column( "Sum" ) );
// Build Combinations
For( nInCombo = 2, nInCombo <= endCol, nInCombo++,
combos = NChooseK Matrix( endCol, nInCombo );
Show( endcol, combos );
For( row = 1, row <= N Rows( combos ), row++,
Current Data Table( dt );
name = "";
cols = N Cols( combos );
code = "x=Sum( col sum( :\!"" || colNames[combos[row, 1, 1]] || "\!"n)";
name = colNames[combos[row, 1, 1]];
For( col = 2, col <= cols, col++,
code = code || ", col sum( :\!"" || colNames[combos[row, col, 1]] || "\!"n)";
name = name || " + " || colNames[combos[row, col, 1]];
);
code = code || " )";
Eval( Parse( code ) );
dtOutput << add rows( 1 );
dtOutput:Columns Used[N Rows( dtOutput )] = name;
dtOutput:Sum[N Rows( dtOutput )] = x;
);
);
Si desea que las sumas se realicen fila por fila, mi código se puede cambiar fácilmente para crear en la tabla de datos existente, una nueva columna para cada una de las combinaciones.
Re: ¿Cómo puedo obtener la suma de todas las diferentes combinaciones de un grupo de columnas?Hola Jim,
Muchas gracias por tu ayuda,
Esto es exactamente lo que estaba buscando, necesito obtener una columna con la suma de cada una de las combinaciones si es posible (todas las combinaciones posibles de 2, 3, 4, 5, 6, 7, 8 Y 9 columnas)
Recién estoy comenzando en JSL y realmente aprecio toda su ayuda,
Re: ¿Cómo puedo obtener la suma de todas las diferentes combinaciones de un grupo de columnas?Aquí está la modificación del código que envié anteriormente.Este código agrega una nueva columna para cada combinación de las primeras 10 columnas.Agrega 1013 nuevas columnas.Por favor, compruebe la exactitud de las adiciones a la tabla de datos.
Names Default To Here( 1 );
dt = data table("sum combined");
startCol = 2;
endCol = N Col( dt ) ;
colNames = dt << get column names( string );
// Build Combinations
For( nInCombo = 2, nInCombo <= endCol, nInCombo++,
combos = NChooseK Matrix( endCol, nInCombo );
For( row = 1, row <= N Rows( combos ), row++,
// create the column name and the formula for the new column
name = "";
cols = N Cols( combos );
code = "Sum( :\!"" || colNames[combos[row, 1, 1]] || "\!"n";
name = "\!"" || colNames[combos[row, 1, 1]];
For( col = 2, col <= cols, col++,
code = code || ", :\!"" || colNames[combos[row, col, 1]] || "\!"n";
name = name || " + " || colNames[combos[row, col, 1]];
);
name = name || "\!"";
code = code || " )";
eval(parse("dt << new column(" || name || ", formula(" || code || "));"));
// Uncomment the next line to remove the formula for the column. This
// will probably make the data table run faster
//column(dt,ncols(dt)) << delete property("formula");
);
);Re: ¿Cómo puedo obtener la suma de todas las diferentes combinaciones de un grupo de columnas?¡Muchas gracias Jaime por tu ayuda!