El script JSL crea múltiples columnas<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hola
Me gustaría pedir ayuda con JMP Scripting.
Necesito recuperar automáticamente varios nombres de columna de la tabla actual, y para cada columna crear una nueva columna, usando una fórmula.
Por ejemplo, esta es mi mesa.
ID de unidad Datos1 Datos2 Datos3
1.1 1.2 1.1
B 1,2 1,2 1,0
1.3 1.2 1.4
1.1 1.2 1.1
1 - Necesito seleccionar las columnas de Data1 a Data3
2 - necesita crear 3 nuevas columnas, como sigue Data1_Floor, Data2_Floor, Data3_Floor
3 - cada nueva columna se calculará como una función de "Piso" utilizando los datos de la columna original: Data1_Floor = Floor (Data1), ...
Agradecería un ejemplo de script JSL con algunos comentarios.
gracias
Alex
Re: El script JSL crea múltiples columnasEsto debería hacerlo:
dt = current data table();
startcol = 2;
endcol = 4;
for (i = startcol, i <= endcol, i++,
data_col = column(i) << get name;
floor_col = data_col || "_Floor";
str = evalinsert(
"\[dt << new column( "^floor_col^", Numeric, Continuous, Format( "Best", 12 ),
formula(floor(:^data_col^)));]\");
eval(parse(str));
);
Re: El script JSL crea múltiples columnasPermíteme preguntarte también: ¿qué pasaría si mis columnas no tuvieran una cadena común en sus nombres?¿Cómo puedo hacer que funcione para que, en lugar de "ifcontains", tenga que decirle a la secuencia de comandos que tome las columnas de la columna B a la columna D, o en orden numérico, tome las columnas del n. ° 2 al n. ° 4?
Re: El script JSL crea múltiples columnasGenial, eso funciona, gracias
Re: El script JSL crea múltiples columnasEstás cerca.Necesitas asignar la variable dt para apuntar a su tabla de datos.Puedes hacerlo con:
// Replace <YOUR table="" name=""> with the actual name of your table
dt = data table("<YOUR table="" name="">");
or with:
dt = current data table();</YOUR></YOUR>
Re: El script JSL crea múltiples columnasHola PMroz,
gracias por una respuesta rápida, lo aprecio.Desafortunadamente, soy nuevo en JSL, por lo que no pude reproducirlo, intenté ejecutar su script desde la línea " col_list = ..." pero no obtuve el resultado que esperaba.Debo estar haciendo algo mal.
Esto es lo que me gustaría conseguir.
Esta es mi tabla de datos original:
| UNIDAD | Datos 1 | Datos 2 | Datos 3 |
| A | 12.35336 | 8.876483 | 3.207919 |
| B | 9.838289 | 1.483974 | 2.5232 |
| C | 3.136643 | 6.092754 | 0.980194 |
| D | 0.3593 | 4.639877 | 6.672549 |
Me gustaría ejecutar el script que obtendrá todas las columnas con la cadena "Datos" y para cada una de ellas generará la nueva columna, por lo que la tabla final se vería así:
| UNIDAD | Datos 1 | Datos 2 | Datos 3 | Piso de datos 1 | Piso de datos 2 | Piso de datos 3 |
| A | 12.35336452 | 8.876483446 | 3.207918972 | 12 | 8 | 3 |
| B | 9.838288756 | 1.483974287 | 2.523200042 | 9 | 1 | 2 |
| C | 3.136642653 | 6.092754288 | 0.980193636 | 3 | 6 | 0 |
| D | 0.359299803 | 4.639877062 | 6.672548555 | 0 | 4 | 6 |
¿Podría intentar hacer un script para hacer esta acción?
Re: El script JSL crea múltiples columnas
// Create data table
dt = New Table( "Floor Example",
Add Rows( 4 ),
New Column( "Unit ID", Character, Nominal, Set Values( {"A", "B", "C", "D"} ) ),
New Column( "Data1", Numeric, Continuous, Format( "Best", 12 ),
Set Values( [1.1, 1.2, 1.3, 1.1] ) ),
New Column( "Data2", Numeric, Continuous, Format( "Best", 12 ),
Set Values( [1.2, 1.2, 1.2, 1.2] ) ),
New Column( "Data3", Numeric, Continuous, Format( "Best", 12 ),
Set Values( [1.1, 1, 1.4, 1.1] ) ),
);
// Get the list of column names
col_list = dt << get column names(string);
// Loop over column names, searching for data columns
for (i = 1, i <= nitems(col_list), i++,
// If it's a Data column then add the floor formula
if (contains(col_list[i], "Data"),
data_col = ":" || col_list[i];
floor_col = col_list[i] || "_Floor";
// Build new column string dynamically and then execute it.
str = evalinsert(
"\[dt << New Column( "^floor_col^", Numeric, Continuous, Format( "Best", 12 ),
Formula( Floor( ^data_col^))
);]\");
eval(parse(str));
);
);