<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hola,
Tengo una lista de cadenas que son nombres de columna. Quiero determinar la ubicación de su columna (i) en una tabla de datos y luego agregar una nueva columna con la fórmula (Columna (i) + Columna (i + 1)). Mi código se ve así:
| UNA | segundo | do | re | mi | F |
|---|
1 | 2 | 3 | 4 | 5 | 6 |
| 1 | 2 | 3 | 4 | 5 | 6 |
| 1 | 2 | 3 | 4 | 5 | 6 |
cols = dt << Get Column Names (St
anillo);
list = {"B", "D"};
n = N Artículos (lista);
localizar = {}:
Para (i = 1, i <= n, i ++,
localizar = Loc (dt, lista );
Nueva columna ("Nuevo", Fórmula (Columna (localizar ) + Columna (localizar + 1)))
);
Tengo problemas porque Loc () devuelve una matriz y Column () solo puede evaluar un número. Quiero que mi tabla de datos final se vea así:
| UNA | segundo | do | re | mi | F | Nuevo | Nuevo 2 |
|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 5 | 9 |
| 1 | 2 | 3 | 4 | 5 | 6 | 5 | 9 |
| 1 | 2 | 3 | 4 | 5 | 6 | 5 | 9 |
| 1 | 2 | 3 | 4 | 5 | 6 | 5 | 9 |
¿Puede alguien ayudarme?
Una columna de fórmula, naturalmente, no funcionará si se eliminan las columnas dependientes. Si desea eliminar las columnas que utiliza la fórmula, ¿para qué utilizarlas en primer lugar? Si solo busca la suma y no le interesan las ventajas dinámicas que ofrece una fórmula de columna, le sugiero que no use fórmulas (lo que también facilita la tarea).
Prueba esto en la tabla de arriba:
lista = { "SEGUNDO" , "RE" } ;
localizar = Expr ( Loc ( cols , lista El yo ] ) [ 1 ] ) ;
por ( yo = 1 , yo <= N artículos ( lista ) , yo ++,
cols = dt << Obtener nombres de columna ( Cuerda ) ;
columna = dt << Nueva Columna ( "Nuevo" , numérico ) ;
Por cada fila ( columna [] = Columna ( localizar ) [] + Columna ( localizar + 1 ) [] ) ;
dt << eliminar columnas ( Columna ( localizar ) , Columna ( localizar + 1 ) ) ;
columna << escoger un nombre ( lista El yo ] ) ;
) ;
Muchas gracias! Este enfoque funciona muy bien.
También tengo una pregunta de seguimiento. Me gustaría hacer algunos cambios en las columnas de esta nueva tabla:
| UNA | segundo | do | re | mi | F | Nuevo | Nuevo 2 |
|---|
1 | 2 | 3 | 4 | 5 | 6 | 5 | 9 |
| 1 | 2 | 3 | 4 | 5 | 6 | 5 | 9 |
| 1 | 2 | 3 | 4 | 5 | 6 | 5 | 9 |
¿Hay alguna forma de eliminar las 4 columnas que se sumaron para crear las columnas "Nuevo" y "Nuevo 2" y cambiarles el nombre usando list = {"B", "D"} para que la tabla resultante tenga este aspecto:
| UNA | F | segundo | re |
|---|
| 1 | 6 | 5 | 9 |
| 1 | 6 | 5 | 9 |
| 1 | 6 | 5 | 9 |
Obtener las variables de columna en las fórmulas de columna por jsl no es sencillo. La fórmula debe verse exactamente como la expresión final, es decir, nada se evalúa automáticamente. El truco consiste en definir y manipular expresiones (o cadenas) y luego usar la combinación correcta de eval, parse, etc.
A continuación se muestra un ejemplo que parece funcionar. Es un poco circular, ya que ubica las columnas por su nombre y luego vuelve a tener su nombre, que luego se analiza. ¡Banco de iglesia! No podría encontrar un procedimiento más simple, pero está interesado si alguien tiene una idea de solución más elegante.
// hacer la tabla de ejemplo
dt = Nueva mesa ( "prueba" ,
Añadir filas ( 3 ) ,
Nueva Columna ( "UNA" , Numérico , Continuo , Formato ( "Mejor" , 1 ) , Valores establecidos ( El 1 , 1 , 1 ] ) ) ,
Nueva Columna ( "SEGUNDO" , Numérico , Continuo , Formato ( "Mejor" , 12 ) , Valores establecidos ( El 2 , 2 , 2 ] ) ) ,
Nueva Columna ( "DO" , Numérico , Continuo , Formato ( "Mejor" , 12 ) , Valores establecidos ( El 3 , 3 , 3 ] ) ) ,
Nueva Columna ( "RE" , Numérico , Continuo , Formato ( "Mejor" , 12 ) , Valores establecidos ( El 4 , 4 , 4 ] ) ) ,
Nueva Columna ( "MI" , Numérico , Continuo , Formato ( "Mejor" , 12 ) , Valores establecidos ( El 5 , 5 , 5 ] ) ) ,
Nueva Columna ( "F" , Numérico , Continuo , Formato ( "Mejor" , 12 ) , Valores establecidos ( El 6 , 6 , 6 ] ) )
) ;
// El script comienza aquí
cols = dt << Obtener nombres de columna ( Cuerda ) ;
lista = { "SEGUNDO" , "RE" } ;
// Localiza la columna expr
localizar = Expr ( Loc ( cols , lista El yo ] ) [ 1 ] ) ;
// Nueva columna con fórmula expr
F = Expr ( Nueva Columna ( "Nuevo" , Fórmula ( Expr ( Analizar gramaticalmente ( Columna ( localizar ) << obtener nombre ) )
+ Expr ( Analizar gramaticalmente ( Columna ( localizar + 1 ) << obtener nombre ) ) ) ) ) ;
// Loop over list
por ( yo = 1 , yo <= N artículos ( lista ) , yo ++,
Evaluar ( Eval Expr ( F ) )
) ;