For Loop no evalúa la fórmula correctamente.<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Estoy tratando de crear nuevas columnas en una tabla de datos, cada nueva columna es el puntaje Z de una columna existente. Esto es lo que tengo
Colnames_1st = dt_zscore3 << Obtener nombres de columna ();
nlist = N Items (Colnames_1st);
para (i = 5, i <= 10, i ++,
var1 = Columna (Colnames_1st );
media = Col Mean (var1);
stdev = Col Std Dev (var1);
namevar = char (Colnames_1st );
Nueva columna ("Zscore" || namevar,
Numérico, Continuo,
Formato ("Mejor", 12),
Fórmula ((((var1 []) - mean) / stdev)));
);
El código crea las 6 nuevas columnas y las nombra correctamente.
Pero cuando va a completar los valores en todas las columnas, no lo hace correctamente.
Todas las columnas terminan con el mismo valor en cada fila. Me parece que me gusta.
está creando las columnas, pero luego espera hasta que el bucle for haya terminado para calcular el
valores que van en cada fila en todas las columnas, por lo que utiliza el último valor de todos
Las variables para todas las columnas, en lugar de calcular la fórmula para cada
columna usando los valores que deben ser utilizados por esa columna.
Estoy realmente atascado. He intentado todo tipo de cosas, pero no puedo superar este obstáculo.
Cualquier ayuda sería muy apreciada.
Re: For Loop no evalúa la fórmula correctamente.Creo que puede haber un problema con su solución. Puede funcionar cuando se crean las columnas, pero no en otra sesión o si se cambian o agregan datos en las columnas de origen.
Si miras las fórmulas en las nuevas columnas, sospecho que todas se verán como "(var1 [] - mean) / stdev". Estos nombres de variables solo tienen sentido en el contexto del script actual (o incluso dentro de una iteración específica de bucle for). Si las variables se redefinen o borran, las fórmulas no funcionarán correctamente.
Las fórmulas deben ingresarse literalmente porque las variables en el argumento Fórmula () aparentemente no se evalúan, sino que se toman literalmente. Si es necesario usar variables, por ejemplo, en for loop, esto se puede lograr mediante la manipulación de cadenas o expresiones.
Ejemplo utilizando evalexpr () para evaluar expresiones dentro de una expresión antes de evaluarla:
dt = Abierto ( "$ SAMPLE_DATA / Big Class.jmp" ) ;
norte = N Col ( dt ) ;
por ( yo = 4 , yo <= norte , yo ++,
var1 = Columna ( yo ) ;
Evaluar (
Eval Expr (
dt << Nueva Columna ( "Zscore" || ( var1 << obtener nombre ) ,
Numérico ,
Continuo ,
Fórmula ( Col estandarizar ( Expr ( var1 ) ) )
)
)
) ;
) ;
Re: For Loop no evalúa la fórmula correctamente.Creo que finalmente encontré una solución.
Tengo la sensación de que mi problema radica en definir variables como local vs global, pero no importa lo que haya intentado, no pude encontrar la manera de solucionarlo de esa manera.
En su lugar he añadido la línea.
dt_zscore3 << Ejecutar fórmulas
y ahora lo hace correctamente.
Colnames_1st = dt_zscore3 << Obtener nombres de columna ();
nlist = N Items (Colnames_1st);
para (i = 5, i <= nlist, i ++,
Nombres predeterminados hasta aquí (1);
var1 = Columna (Colnames_1st );
// var1 = Columna (Colnames_1st );
media = Col Mean (var1);
stdev = Col Std Dev (var1);
namevar = char (Colnames_1st );
Nueva columna ("Zscore" || namevar,
Numérico, Continuo,
Formato ("Mejor", 12),
Fórmula ((((var1 []) - mean) / stdev)));
dt_zscore3 << Ejecutar fórmulas
);
Posiblemente no sea elegante o la forma más correcta de hacerlo, pero lo publico en caso de que alguien lo encuentre útil.