¿Cómo encajar los datos en una lista estándar de columnas?Tengo un conjunto de columnas estándar que me gustaría usar para varias tablas de datos, el problema es que algunas tablas de datos pueden no contener TODAS esas columnas.
¿Cómo puedo simplemente:
1. Cree una tabla de datos con esas listas de columnas estándar (por ejemplo: ES1, ES2, ES3, ES4, ES5)
2. Lea una tabla de datos que puede contener parte de las columnas anteriores (por ejemplo, ES1, ES3)
| | ES1 | ES3 |
| Línea de conteo 1 | 2 | 4 |
| Línea de conteo 2 | 2 | 10 |
3. Cree la tabla de datos del conteo de la tabla de datos # 2 con la lista completa de columnas estándar:
| | ES1 | ES2 | ES3 | ES4 | ES5 |
| Línea de conteo 1 | 2 | 0 | 4 | 0 | 0 |
| Línea de conteo 2 | 2 | 0 | 10 | 0 | 0 |
Re: ¿Cómo encajar los datos en una lista estándar de columnas?Aquí hay un par de maneras diferentes para hacer esto.
Names Default To Here( 1 );
dt1 = Data Table( "Your first table" );
dt2 = Data Table( "Your second table" );
dt1 << concatenate( dt2 );
Names Default To Here( 1 );
StdNamesList = {"PQrz", "acgh","bddxy","abcd"};
ExistingColNames = dt << get column names;
dt2 = Data Table( "Your second table" );
// If a std name exits in the data table, eliminate it from this working copy of the
// translate data table
For(i=1,i<=ncols(dt),i++,
If(contains(StdNamesList,ExistingColNames[i])
stdNamesList = remove( stdNamesList,contains(StdNamesList,ExistingColNames[i], 1))
)
);
// Add in the missing columns
For(i=1,i<=ncols(dt),i++,
dt2 << New Column(StdNamesList[i],set each value(0));
);Re: ¿Cómo encajar los datos en una lista estándar de columnas?Hola Jim,
La concatenación no parece sumar los valores de las filas comunes, por ejemplo, para NDP1007, anticiparía que el valor de ES3 ahora sea 7 (la suma total de la Hoja 1, Hoja 1 2).
¿Hay alguna manera de que pueda hacer esto?
Saludos cordiales,
Zach

Re: ¿Cómo encajar los datos en una lista estándar de columnas?¿Alguna idea sobre cómo sumar dos tablas separadas como he indicado anteriormente?
Saludos cordiales,
ZachRe: ¿Cómo encajar los datos en una lista estándar de columnas?Dada su nueva especificación, el problema se vuelve un poco más complejo. No hay una función de resumen integrada en JMP. Hay tantas acciones diferentes que uno puede querer hacer con la unión de datos, la suma no se establece como el elemento predeterminado para hacer. El script simple a continuación realiza la suma que desea. La mayoría del código que se muestra, solo está ahí para crear las tablas de datos de muestra. Solo el código en las líneas 32-59 hace el trabajo de juntar los datos.
Names Default To Here( 1 );
// Create the sample data tables
dt = New Table( "Primary",
Add Rows( 3 ),
New Column( "Column 1",
Character,
"Nominal",
Set Selected,
Set Values( {"NDP1007", "NDP2024", "NDP3030"} )
),
New Column( "ES1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 2, 1] ) ),
New Column( "ES2", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [5, 0, 1] ) ),
New Column( "ES3",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [5, 0, 2] ),
Set Display Width( 46 )
),
New Column( "ES4", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [3, 1, 3] ) ),
New Column( "ES5", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 2, 3] ) ),
Set Row States( [0, 1, 0] )
);
dt2 = New Table( "Secondary",
Add Rows( 2 ),
New Column( "Column 1", Character, "Nominal", Set Values( {"NDP1007", "NDP2024"} ) ),
New Column( "ES1", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 0] ) ),
New Column( "ES3", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [2, 3] ) )
);
// Change the names in the Secondary data table so after joining they can be summed together
// and create a list of the new names
newColNameList = {};
For( i = 2, i <= N Cols( dt2 ), i++,
Column( dt2, i ) << set name( (Column( dt2, i ) << get name) || "_X" );
Insert Into( NewColNameList, Column( dt2, i ) << get name );
);
// Update the primary data table with the secondary table
dt << Update( With( dt2 ), Match Columns( :Column 1 = :Column 1 ) );
// Create the code to add the data together that needs to be summed
For( col = 1, col <= N Items( newColNameList ), col++,
// Make sure the standard name is in the data table and if so, add
// the values together
If( Try( Column( dt, Word( -2, newColNameList[col], "_" ) ) << get name ) != "",
For( theRow = 1, theRow <= N Rows( dt ), theRow++,
Column( dt, Word( -2, newColNameList[col], "_" ) )[theRow] = Sum(
Column( dt, Word( -2, newColNameList[col], "_" ) )[theRow],
Column( dt, newColNameList[col] )[theRow]
)
)
)
);
// Delete the Secondary column no longer needed
dt << delete columns( newColNameList );Re: ¿Cómo encajar los datos en una lista estándar de columnas? @ zjuv007 ,
Jim @txnelson , te proporcionamos las claves para combinar tus mesas. El último paso para obtener la suma de registros comunes es ejecutar un resumen de tabla.
La siguiente secuencia de comandos se basa en la primera solución de Jim y asume que desea la suma () de todas las columnas numéricas. Es posible que desee modificar numclist para que sea una lista de posibles columnas, como lo demostró el segundo script de Jim. Se adjuntan el script y las tablas de datos, hoja1 y hoja2.
Names Default To Here( 1 );
dt1 = Data Table( "sheet1" );
dt2 = Data Table( "sheet2" );
dt3 = dt1 << concatenate( dt2 );
numclist = dt1 << Get Column Names(Numeric, String);
sumXP = Expr(Summary(
Group( :Column 1 ),
Weight( "None" ),
statistics column name format( "column" ),
Link to original data table( 0 ),
Output Table Name ("Summed Table")
) );
for(i=1, i<=nitems(numclist), i++,
Insert Into(sumXP, EvalExpr(Sum(Column(Expr(numclist[i])))))
);
show(NameExpr(sumXP) );
Eval (EvalExpr(dt3 << expr(sumXP) ) );
dt = Data Table( "Summed Table" );
//option
dt << delete column( {"N Rows"});

Re: ¿Cómo encajar los datos en una lista estándar de columnas?Si quiero expandir esto para sumar en N tablas, ¿hay una forma sencilla de corregir Sum2Tables.jsl para realizar esto? (En la mayoría de los casos, lo limitaría a N = 5).
Saludos cordiales, esto funcionó!Re: ¿Cómo encajar los datos en una lista estándar de columnas?Además, SI me gustaría simplemente generar una lista estándar de estas columnas, en los casos en que la primera tabla que tomo no tenga todas las columnas apropiadas ... ¿Puedo hacer esto primero, luego simplemente completar y contar como ceros donde no hay recuentos en esa columna de suma específica?Re: ¿Cómo encajar los datos en una lista estándar de columnas?Antes de formular las siguientes preguntas de seguimiento, debe estudiar la respuesta que se proporciona, para que pueda comprender cómo funciona. Si entiendes la afirmación
dt3 = dt1 << concatenate( dt2 );
y búsquelo en la Guía de secuencias de comandos, o en el Índice de secuencias de comandos, verá que puede Concatenar juntas tantas tablas de datos en una declaración como desee.
En cuanto a tu segunda pregunta, cambiando la línea.
numclist = dt1 << Get Column Names(Numeric, String);
a
numclist = dt3 << Get Column Names(Numeric, String);
le dará una lista completa de todas las columnas encontradas en todas las tablas de datos. Usar esa lista combinada podría ser la respuesta que necesita