Eliminazione di più colonne in base alle stringhe nel loro nomeCIAO,
Devo eliminare più colonne in base alle stringhe che contengono, ma a volte voglio mantenerne altre anche se non contengono quelle stringhe.
Quindi, seguendo la soluzione di questo post Eliminazione di più colonne in base al nome della colonna
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)
)
);
Quindi, quello che voglio avere è rimuovere tutto ciò che non contiene "Gross" o "Genre" ma se il nome della colonna è == "theme" non rimuoverlo.
Sembra che per ora non funzioni! Perché?

Il secondo proiettile a questa domanda
Come posso vedere col_names come una tabella di dati in modo da poter sapere qual è l'output senza passare il mouse su col_names. Perché a volte ho un lungo elenco di nomi di colonne e il passaggio del mouse non è efficiente per vedere cosa c'è in quell'elenco di colonne.
Grazie!
Personalizzazione di massaRi: Eliminazione di più colonne in base alle stringhe nel loro nomeLa tua confusione sulla tabella dei dati è qualcosa che ho visto prima.La differenza tra JMP e le sue tabelle di dati è che una tabella di dati deve essere considerata come un elemento di base.La maggior parte delle volte, si vedrà una riga di JSL come:
dt = Open("$SAMPLE_DATA/big class.jmp");
In alcune lingue, dt sarebbe la tabella dei dati.Questo non è il caso.L'istruzione precedente assegna solo un puntatore alla tabella dati "Big Class".E se passi il mouse sopra la variabile dt vedrai
data table( "Big Class" )
come è valore.
Pertanto, se eseguo l'istruzione
xyz = dt;
Non ottengo una nuova istanza della tabella dati Big Class, come farei in alcune lingue, invece, tutto ciò che ottengo è una variabile chiamata xyz che è un puntatore alla stessa tabella dati chiamata Big Class.
Per creare una nuova copia (non è una nuova istanza, perché una volta creata in genere è una nuova tabella di dati totalmente indipendente) si utilizza una delle piattaforme Table per completare l'attività
dt2 = dt << subset( all rows, all columns);
Il comando precedente crea una nuova tabella dati e imposterà la variabile dt2 come puntatore alla nuova tabella.
Ri: Eliminazione di più colonne in base alle stringhe nel loro nomeJim,
Scusa per l'incomprensione. Ma la maggior parte delle cose che cerco non sono ben descritte o solo brevemente spiegate nel pdf jsl. Specialmente lo scripting ricorsivo (if-else, for loop) quando vuoi fare cose complesse non sono incluse nel manuale. È molto difficile anche tenere traccia degli errori. Non l'ho fatto finché non hai detto di controllare il 'registro'.
Ad esempio, non vi è alcuna spiegazione sulla creazione di una nuova tabella dati o su come assegnare una nuova tabella dati.
Quello che stavo pensando in modo semplice come
dt_new << Data Table( col_names );
dovrebbe creare una nuova tabella dati ma ho imparato che non è semplice in jmp. Dobbiamo chiedere o esercitarci sulla sintassi che sto facendo.
Molte grazie!
Ri: Eliminazione di più colonne in base alle stringhe nel loro nomeSe stampi il valore di "col_names" subito dopo che è stato creato, mostra tutte le colonne nella tabella dati
{"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"}
Se guardi da vicino, vedrai che non c'è una voce con il valore "tema". C'è una voce con il valore "Tema".Stai confrontando i valori nelle stringhe di caratteri e devi far corrispondere correttamente lettere maiuscole e minuscole.
Ti suggerisco caldamente di leggere la Guida allo scripting!
Aiuto==>Guida allo scripting della libreria della documentazione di JMP
Ri: Eliminazione di più colonne in base alle stringhe nel loro nomePerché
col_names[i] == "theme"<BR />
non funziona ancora?

Ri: Eliminazione di più colonne in base alle stringhe nel loro nomedt = 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 );
Ri: Eliminazione di più colonne in base alle stringhe nel loro nomeCiao Jim,
Grazie per la tua risposta. Ok ho capito quello che dici.
Diciamo che non ci interessano le formule. Cancelliamo tutte le connessioni della formula e rimuoviamo le colonne che volevo.
e voglio creare (e vedere) quelle colonne cancellate come un datatable
seguendo il tuo suggerimento
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 );
questo non crea ancora ciò di cui ho bisogno 
Ri: Eliminazione di più colonne in base alle stringhe nel loro nomeDal JSL che hai fornito, hai tralasciato l'affermazione più critica
dt << delete columns( col_names );
Questa è la riga che esegue effettivamente le eliminazioni.Tuttavia, in questo caso di esempio, presenta un problema aggiuntivo.L'elenco finale delle colonne
{"Genre", "Domestic Gross", "Foreign Gross", "World Gross", "Opening Wknd Gross"}
contiene la colonna "World Gross", che viene utilizzata nel calcolo della colonna "redditività".Quando il messaggio "elimina colonne" viene elaborato, rileva il problema e viene visualizzato nel 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.
Se elimini la formula dalla colonna "Redditività", convertirà i valori in valori statici,
dt:Profitability << delete formula;
quindi le "colonne cancellate" funzioneranno correttamente.
Per quanto riguarda il tuo problema relativo al passaggio del mouse su una variabile per vederne il valore e al desiderio di creare una tabella di dati per poter vedere i valori, esiste un modo molto più semplice per farlo.Piuttosto che passare con il mouse sopra la variabile "col_names", ciò che devi fare è evidenziarla, quindi fare clic con il pulsante destro del mouse e selezionare "Esegui script".Di norma, se qualcosa in uno script JMP è evidenziato, "Esegui script" eseguirà solo le righe/istruzioni/variabili evidenziate.I risultati verranno visualizzati nel registro.