Crear un total acumulado de una columna<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Me pregunto cómo crear una columna en una tabla JMP que sea el total acumulado de otra columna (a la que es posible que deba hacer referencia a través del nombre de la columna como una cadena). Es decir, si tengo una columna con los siguientes datos:
1
2
3
4
5
Me gustaría crear una columna con una fórmula cuyo contenido funcione para
1
3
6
10
15
Actualmente tengo este ciclo, trabajando a partir de una lista de nombres de columnas para obtener el total acumulado de:
For(i = 2, i <= numCols, i++,
colName = colNames ;
col = Nueva Columna("Cumulativo" || colName,
Fórmula (suma (j = 1, fila (), como columna (ColName)))
);
);
Esto parece funcionar, pero es muy lento y si creo varias columnas, todas terminan con los mismos datos de alguna manera. ¿Cuál es la mejor manera de hacer esto?
Re: Crear un total acumulado de una columnaPor cierto, si la lista de colNames contiene nombres en lugar de cadenas, este enfoque parece dar el mismo resultado que la cadena analizada:
colNames = dt << obtener nombres de columna ( ) ; // ¡Sin la opción "cadena"!
numCols = N artículos ( colNames ) ;
Para ( i = 1 , i <= numCols , i ++,
colName = colNames [ i ] ;
nuevo nombre = "acumulativo" || ( colName << obtener nombre ) ;
columna = Nueva columna ( nuevo nombre , Numérico , Continuo ,
Fórmula ( evaluar ( Sustituto (
exp. ( Suma ( j = 1 , Fila () , xxx [ j ])) ,
exp. ( xxx ) , colNames [ i ]
)))
) ;
) ;
Re: Crear un total acumulado de una columnaSí, eso debería funcionar siempre y cuando nunca se cambie el nombre de las columnas.
Este código ilustra la diferencia entre los dos enfoques. El feo método de cadena codifica la fórmula en una columna específica. El segundo método busca una columna con un nombre específico (que podría ser útil)
// tabla de ejemplo
dt = Nueva tabla ( "Prueba" ,
Agregar filas ( 4 ) ,
Nueva columna ( "Col1" , Numérico , Establecer valores ( [ 1 , 2 , 3 , 4 ] ) )
) ;
// Agregar fórmula por cadena analizada
colNames = dt << obtener nombres de columna ( cadena ) ;
numCols = N artículos ( colNames ) ;
Para ( i = 1 , i <= numCols , i ++,
colName = colNames [ i ] ;
columna = Nueva columna ( "acumulativo" || colName , Numérico ) ;
evaluar (
Analizar gramaticalmente (
Insertar evaluación (
"col<< Establecer fórmula (suma (j = 1, fila (), ^ (ColName)^))"
)
)
) ;
) ;
// Añadir fórmula sustituyendo la expresión
Para ( i = 1 , i <= numCols , i ++,
colName = colNames [ i ] ;
nuevo nombre = "acumulativo" || colName ;
columna = Nueva columna ( nuevo nombre ,
Numérico ,
Continuo ,
Fórmula (
evaluar (
Sustituto (
exp. (
Suma ( j = 1 , Fila () , como columna ( xxx )[ j ] )
) ,
exp. ( xxx ) , colName
)
)
)
) ;
) ;
Esperar ( 1 ) ;
// Cambiar el nombre de la columna y un valor y ver cómo funcionan las fórmulas
Columna ( 1 ) << escoger un nombre ( "Nuevo nombre" ) ;
Columna ( 1 )[ 1 ] = 100 ;
Esperar ( 2 ) ;
// Agrega una nueva columna con el mismo nombre que la columna original.
dt << Nueva columna ( "Col1" , numérico , valores ( [ 1 , 1 , 1 , 1 ] ) ) ;
dt << volver a ejecutar fórmulas ;
Re: Crear un total acumulado de una columnaSiento que si hay una manera de hacer que JSL haga lo que quiere analizando una cadena, entonces debería haber una manera de hacerlo sin usar la función Parse, con código JSL simple (que, después de todo, es solo una cadena) . Esto es lo que tengo que trabajar usando Substitute:
For(i = 2, i <= numCols, i++,
colName = colNames ;
newName = "Cumulativo" || colName;
col = Nueva columna (nuevo nombre, numérico, continuo,
Fórmula(Eval(Sustituir(
Expr(Suma(j = 1, Fila(), Como columna(xxx))),
Expr(xxx), nombreCol
)))
);
);
Re: Crear un total acumulado de una columnaFormula() no evalúa su argumento, por lo que todas las fórmulas de columna contendrán las variables ColName y J y se actualizarán a medida que avanza el ciclo.
Aquí hay una forma de evitar esto:
Para ( i = 2 , i <= numCols , i ++,
colName = colNames [ i ] ;
columna = Nueva columna ( "acumulativo" || colName , Numérico ) ;
evaluar (
Analizar gramaticalmente (
Insertar evaluación (
"col<< Establecer fórmula (suma (j = 1, fila (), ^ (ColName)^))"
)
)
) ;
) ;