Eliminar varias columnas en función de las cadenas en su nombreHola,
Necesito eliminar varias columnas en función de las cadenas que contienen, pero a veces quiero conservar algunas otras incluso si no contienen esas cadenas.
Entonces, siguiendo la solución de esta publicación Eliminación de varias columnas según el nombre de la columna
dt = Open( "$sample_data/Hollywood Movies.jmp" );
col_names = dt << Get Column Names( String );
For( i = N Items( col_names ), i > 0, i--,
If(
Not(
Contains( col_names[i], "Gross") | contains(col_names[i], "Genre" ) | col_names[i] == "theme"),
Remove From( col_names, i)
)
);
Entonces, lo que quiero es eliminar todo lo que no contenga "Gross" o "Género", pero si el nombre de la columna es == "tema", no lo elimine.
¡Parece que no funciona por ahora! ¿Por qué?

La segunda viñeta de esta pregunta
¿Cómo puedo ver col_names como una tabla de datos para saber cuál es el resultado sin pasar el cursor sobre col_names? Porque a veces tengo una larga lista de nombres de columnas y pasar el cursor por encima no es eficiente para ver qué hay en esa lista de columnas.
¡Gracias!
La personalización en masaRe: Eliminar varias columnas en función de las cadenas en su nombreTu confusión sobre la tabla de datos es algo que he visto antes.La diferencia entre JMP y sus tablas de datos es que una tabla de datos debe considerarse como un elemento base.La mayor parte del tiempo, uno verá una línea de JSL como:
dt = Open("$SAMPLE_DATA/big class.jmp");
En algunos idiomas, dt sería la tabla de datos.Este no es el caso.La declaración anterior solo asigna un puntero a la tabla de datos "Big Class".Y si pasas el cursor sobre la variable dt verás
data table( "Big Class" )
como su valor.
Por lo tanto, si ejecuto la instrucción
xyz = dt;
No obtengo una nueva instancia de la tabla de datos Big Class, como lo haría en algunos idiomas; en cambio, todo lo que obtengo es una variable llamada xyz, que es un puntero a la misma tabla de datos llamada Big Class.
Para crear una nueva copia (no es una nueva instancia, porque una vez creada, por lo general es una nueva tabla de datos totalmente independiente), se usa una de las plataformas Table para completar la tarea.
dt2 = dt << subset( all rows, all columns);
El comando anterior crea una nueva tabla de datos y establecerá la variable dt2 como un puntero a la nueva tabla.
Re: Eliminar varias columnas en función de las cadenas en su nombreJim,
Perdone mi falta de comprensión. Pero la mayoría de las cosas que busco no están bien descritas o simplemente se explican brevemente en el jsl pdf. Especialmente las secuencias de comandos recursivas (if-else, for loop) cuando desea hacer cosas complejas, no están incluidas en el manual. Es muy difícil rastrear los errores también. No lo hice hasta que me digas que verifique el 'registro'.
Por ejemplo, no hay ninguna explicación sobre cómo crear una nueva tabla de datos o cómo asignar una nueva tabla de datos.
Lo que estaba pensando tan sencillo como
dt_new << Data Table( col_names );
debería crear una nueva tabla de datos, pero aprendí que no es sencillo en jmp. Necesitamos preguntar o practicar sobre la sintaxis que estoy haciendo.
¡Muchas gracias!
Re: Eliminar varias columnas en función de las cadenas en su nombreSi imprime el valor de "col_names" justo después de crearlo, muestra todas las columnas en la tabla de datos
{"Movie Name", "Lead Studio Name", "Rotten Tomatoes Score", "Audience Score",
"Theme", "Genre", "Theaters Opening Wknd", "BOA Opening Wknd", "Domestic Gross",
"Foreign Gross", "World Gross", "Production Budget", "Profitability",
"Opening Wknd Gross"}
Si observa detenidamente, verá que no hay una entrada con el valor "tema". Hay una entrada con el valor "Tema".Está comparando valores en cadenas de caracteres y debe hacer coincidir correctamente mayúsculas y minúsculas.
¡Le sugiero enfáticamente que lea la Guía de secuencias de comandos!
Ayuda==>Guía de secuencias de comandos de la biblioteca de documentación de JMP
Re: Eliminar varias columnas en función de las cadenas en su nombrepor qué
col_names[i] == "theme"<BR />
no sigue funcionando?

Re: Eliminar varias columnas en función de las cadenas en su nombredt = Open( "$sample_data/Hollywood Movies.jmp" );
col_names = dt << Get Column Names( String );
dt:Profitability << delete formula;
For( i = N Items( col_names ), i > 0, i--,
If(
Not(
Contains( col_names[i], "Gross") | contains(col_names[i], "Genre" ) | col_names[i] == "theme"),
Remove From( col_names, i)
)
);
// At this point in the script, you have a data table
// with all of the original columns(Profitability is now a static column)
// And you have a JSL List called "col_names", which is stored in memory
// so you can do anythin you want given this
// You could just write the contents of the list to the log. Remember, the
// list "col_names", only contains the names of the columns, it does not
// contain the whole column(name, properties and data)
Print( col_names );
// or
Write( col_names );
// or
Show( col_names );
// That will give you the list of columns that are going to be deleted
// or before you want to see the columns in their entirety you can create
// a new data table with just those columns
newdt = dt << subset( all rows, columns( col_names ) );
// The statement below, is a perfectly valid statement, however, it will
// not work the way you think it will. The end result of this statement
// is to create a new list of column names.
// {"Genre", "Domestic Gross", "Foreign Gross", "World Gross", "Opening Wknd Gross"}
deleted_columns = delete columns( col_names );
Re: Eliminar varias columnas en función de las cadenas en su nombreHola Jim,
Gracias por tu respuesta. Ok, veo lo que dices.
Digamos que no nos importan las fórmulas. Eliminemos todas las conexiones de fórmula y eliminemos las columnas que quería.
y quiero crear (y ver) esas columnas eliminadas como una tabla de datos
siguiendo tu sugerencia
dt = Open( "$sample_data/Hollywood Movies.jmp" );
col_names = dt << Get Column Names( String );
dt:Profitability << delete formula;
For( i = N Items( col_names ), i > 0, i--,
If(
Not(
Contains( col_names[i], "Gross") | contains(col_names[i], "Genre" ) | col_names[i] == "theme"),
Remove From( col_names, i)
)
);
deleted_columns = delete columns( col_names );
esto no crea todavía lo que necesito 
Re: Eliminar varias columnas en función de las cadenas en su nombreDel JSL que proporcionó, ha omitido la declaración más crítica
dt << delete columns( col_names );
Esta es la línea que realmente hace las eliminaciones.Sin embargo, en este caso de muestra, tiene un problema adicional.La lista final de columnas.
{"Genre", "Domestic Gross", "Foreign Gross", "World Gross", "Opening Wknd Gross"}
tiene la columna "Bruto mundial", que se utiliza en el cálculo de la columna "Rentabilidad".Cuando se procesa el mensaje "eliminar columnas", detecta el problema y se muestra en el registro
Cannot delete the selected columns while some are referenced by the formulas of remaining columns.
Removing a formula leaves the data unchanged. Removing references replaces each reference with an empty value. These effects are permanent and cannot be undone.
Si elimina la fórmula de la columna "Rentabilidad", convertirá los valores en valores estáticos,
dt:Profitability << delete formula;
entonces las "columnas de eliminación" funcionarán correctamente.
Con respecto a su problema de pasar el mouse sobre una variable para ver su valor y querer crear una tabla de datos para poder ver los valores, hay una manera mucho más simple de hacerlo.En lugar de pasar el cursor sobre la variable "col_names", lo que debe hacer es resaltarla y luego hacer clic con el botón derecho y seleccionar "Ejecutar secuencia de comandos".Por regla general, si se resalta algo en una secuencia de comandos JMP, "Ejecutar secuencia de comandos" solo ejecutará las líneas/declaraciones/variables resaltadas.Los resultados se mostrarán en el registro.