Selezione del valore e copia in nuove colonneEHI,
Sto cercando di automatizzare un (apparentemente abbastanza facile) selezione del valore, creazione della colonna e copia/incolla processo, tuttavia, non riesco a trovare la giusta compilazione dello script per questo.
1) Ho bisogno di creare 3 nuove colonne aggiungendo una selezione di valori diversa da uno stessa colonna di origine a ciascuna di queste 3 nuove colonne e creare a sottoinsieme di ogni selezione quando tutte le colonne sono compilate .
2) Il nome dei sottoinsiemi dovrebbe corrispondere all'intestazione del file sorgente originale più una nuova appendice.
Sii consapevole:
La posizione delle colonne e la quantità di righe varia nei file di dati che ho, tuttavia i nomi sono tutti uguali.
Ho provato questi due script che ovviamente non sono corretti ma non so cosa cambiare esattamente per farlo funzionare. Eventuali suggerimenti?
Versione 1:
Names Default To Here( 1 );
dt = Current Data Table();
//Select values to copy into new column
vals 1 = Select Where (:p-value (two-sided test)2 <= 0,09); //it seems that the "2" in the column name is confusing, but unfortunately, it would take a long time to go through all tables and change the column name
// Put these in a new column 1
dt = NewColumn("sign_0,09", Numeric, Continuous, Values(vals1));
Wait( 5 );
//Column 2
vals 2 = Select Where (:p-value (two-sided test)2 <= 0,05);
dt<<GET selected="" rows="" dt="NewColumn("sign_0,05"," numeric=""></GET>
Versione 2:
Names Default To Here( 1 );
dt = Current Data Table();
dt << :p-value (two-sided test)2 = [1,?]; //the end row varies and must be found automatically
results << New Column("sign_0,09", Numerical, Continuous);
For( i = 1, i <= NItems( "p-value (two-sided test)2"), i++,
results << Select Where (:p-value (two-sided test)2 <= 0,09) );
selRows = results << getSelectedRows;
AsColumn( results, "sign_0,09" )[selRows] = "p-value (two-sided test)2"[i];
//same process for 2 other new columns
dt<<SUBSET dt=""><< Select where :sign_0,09 != "";
dt<< Get selected rows
//the new name should be automatically given, too, is that possible?
dt << Subset( Output Table( "name as in original file plus _0,09 at the end" ), Selected Rows( 1 ), selected columns( 0 ) );
//same process for other 2 columns</SUBSET>
Sarei molto felice di trovare una soluzione poiché nei thread finora c'è spesso un copia/incolla in nuove tabelle di dati, tuttavia, "mai" in una nuova colonna, e sembra che sia principalmente correlato a una selezione di stringhe. Non sono sicuro che la selezione funzioni allo stesso modo per i dati numerici.
Grazie per qualsiasi aiuto!
Re: Selezione del valore e copia in nuove colonneEhi, ecco la versione completa senza le funzioni Show in quanto quelle non erano di alcuna utilità nel mio caso.
Grazie per l'aiuto!
dt = Current Data Table(); // Assuming the data table is open
/* Step 1 - add 3 columns */
dt << New Column("sign_0,09",Numeric,Continuous)
<< New Column("sign_0,05",Numeric,Continuous)
<< New Column("sign_0,01",Numeric,Continuous);
// Getting the values of column of interest
ColVals = dt:Name("p-value (two-sided test) 2") << Get Values;
// Set up a dummy matrix
Dummy = J(NRows(dt),1,.);
// All Rows
AllRows = Index(1,NRows(dt),1);
/* Step 2 - Select from the column based on conditions */
/* This could also be replaced by loop */
SR1 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.09);
//do not change "." to "," as the programme uses "." for background calculation
Dummy[SR1,0] = ColVals[SR1];
dt:Name("sign_0,09") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR2 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.05);
Dummy[SR2,0] = ColVals[SR2];
dt:Name("sign_0,05") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR3 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.01);
Dummy[SR3,0] = ColVals[SR3];
dt:Name("sign_0,01") << Set Values(Dummy);
/* End of Step 2 */
/* Step 3 */
dt << Select Where (Name("p-value (two-sided test)2") <= 0.09);
dt << Subset( Output Table( "new_0,09" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.05);
dt << Subset( Output Table( "new_0,05" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.01);
dt << Subset( Output Table( "new_0,01" ), Selected Rows( 1 ), selected columns( 0 ) );
/* End of Step 3 */
Re: Selezione del valore e copia in nuove colonneEhi, ecco la versione completa senza le funzioni Show in quanto quelle non erano di alcuna utilità nel mio caso.
Grazie per il tuo aiuto!
dt = Current Data Table(); // Assuming the data table is open
/* Step 1 - add 3 columns */
dt << New Column("sign_0,09",Numeric,Continuous)
<< New Column("sign_0,05",Numeric,Continuous)
<< New Column("sign_0,01",Numeric,Continuous);
// Getting the values of column of interest
ColVals = dt:Name("p-value (two-sided test) 2") << Get Values;
// Set up a dummy matrix
Dummy = J(NRows(dt),1,.);
// All Rows
AllRows = Index(1,NRows(dt),1);
/* Step 2 - Select from the column based on conditions */
/* This could also be replaced by loop */
SR1 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.09);
//do not change "." to "," as the programme uses "." for background calculation
Dummy[SR1,0] = ColVals[SR1];
dt:Name("sign_0,09") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR2 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.05);
Dummy[SR2,0] = ColVals[SR2];
dt:Name("sign_0,05") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR3 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.01);
Dummy[SR3,0] = ColVals[SR3];
dt:Name("sign_0,01") << Set Values(Dummy);
/* End of Step 2 */
/* Step 3 */
dt << Select Where (Name("p-value (two-sided test)2") <= 0.09);
dt << Subset( Output Table( "new_0,09" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.05);
dt << Subset( Output Table( "new_0,05" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.01);
dt << Subset( Output Table( "new_0,01" ), Selected Rows( 1 ), selected columns( 0 ) );
/* End of Step 3 */
Re: Selezione del valore e copia in nuove colonne@Jeff_Perkinson
Grazie Jeff,
avevo letto troppo tardi il tuo post. Ho appena aggiunto la parte di creazione dei sottoinsiemi alla selezione che hai proposto e, a parte la creazione automatizzata del nome, funziona perfettamente. Grazie per il suggerimento.
dt = Current Data Table();
dt << New Column( "sign_0,09",
Numeric,
"Nominal",
Format( "Best", 9 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.09,
:Name( "p-value (two-sided test) 2" )
)
)
);
dt << New Column( "sign_0,05",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.05,
:Name( "p-value (two-sided test) 2" )
)
)
);
dt << New Column( "sign_0,01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.01,
:Name( "p-value (two-sided test) 2" )
)
)
);
/* Step 3 */
// We already have the rows that meet the conditions
dt << Select Where (Name("p-value (two-sided test)2") <= 0.09);
dt << Subset( Output Table( "new_0,09" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.05);
dt << Subset( Output Table( "new_0,05" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.01);
dt << Subset( Output Table( "new_0,01" ), Selected Rows( 1 ), selected columns( 0 ) );
/* End of Step 3 */ Re: Selezione del valore e copia in nuove colonneRe: Selezione del valore e copia in nuove colonne@uday_guntupalli
Ho eseguito lo script con i miei dati (la tua versione e con lo scambio del suggerimento di @Mark_Bailey ) e funziona per creare le colonne e per ottenere i dati selezionati nella nuova colonna.
Tuttavia, l'ultima parte (vedi sotto) per mostrare le righe selezionate non funziona. L'ho regolato con Seleziona dove e Crea sottoinsieme.
/* Step 3 */
// We already have the rows that meet the conditions
Show(SR1);
Show(SR2);
Show(SR3);
/* End of Step 3 */
/* Step 3 */
dt << Select Where (Name("p-value (two-sided test)2") <= 0.09);
dt << Subset( Output Table( "new_0,09" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.05);
dt << Subset( Output Table( "new_0,05" ), Selected Rows( 1 ), selected columns( 0 ) );
dt << Select Where (Name("p-value (two-sided test)2") <= 0.01);
dt << Subset( Output Table( "new_0,01" ), Selected Rows( 1 ), selected columns( 0 ) );
/* End of Step 3 */
Re: Selezione del valore e copia in nuove colonneGrazie per aver postato qualche dettaglio in più, questo aiuta alcuni.Invece di provare a creare le nuove colonne e riempirle di valori attraverso JSL, creerei semplicemente tre nuove colonne basate su formule con la formula:
If( :Name( "p-value (two-sided test) 2" ) <= 0.09,
:Name( "p-value (two-sided test) 2" )
)

dt = Open( "seas_ratio_1_monthly.jmp" );
dt << New Column( "sign_0.09",
Numeric,
"Nominal",
Format( "Best", 9 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.09,
:Name( "p-value (two-sided test) 2" )
)
)
);
dt << New Column( "sign_0.05",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.05,
:Name( "p-value (two-sided test) 2" )
)
)
);
dt << New Column( "sign_0.01",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( :Name( "p-value (two-sided test) 2" ) <= 0.01,
:Name( "p-value (two-sided test) 2" )
)
)
);
Ma devo ammettere che non sono ancora sicuro di quale sia il valore delle tabelle di dati con solo le righe significative a un livello particolare. Come utilizzerai quei tavoli? Hanno bisogno di tutte e tre le colonne dell'indicatore di significatività (ad esempio, sign_0,09; sign_0,05; e sign_0,01)? In caso contrario, puoi evitare di creare quelle colonne tutte insieme e semplicemente creare un sottoinsieme delle righe inferiori a ciascun livello. Puoi dirci di più sul tuo obiettivo finale e sul perché desideri tabelle di dati come descrivi? Potremmo essere in grado di fornire metodi ancora più semplici.
Re: Selezione del valore e copia in nuove colonneVedo questo approccio ma esiste un modo più semplice che comporta la modifica dello stato della riga selezionata. Invece di questo:
SR1 = dt << Select Where(:Name("p-value (two-sided test) 2") <= 0.09) << Get Selected Rows; <BR />// You can edit this to conform to european convention of 0,09
dt << Clear Select;
Puoi semplicemente usare questo:
SR1 = dt << Get Rows Where(:Name("p-value (two-sided test) 2") <= 0.09)
// You can edit this to conform to european convention of 0,09
In questo modo non disturbi la selezione della riga corrente.
Re: Selezione del valore e copia in nuove colonneSembra fantastico. Lo testerò il prima possibile.
Se fai riferimento a elementi comuni all'interno delle 3 nuove colonne, questo è solo il caso dei valori selezionati che verranno aggiunti a ciascuna delle colonne!
Es. la selezione di valori <= 0,01 apparirà anche nelle colonne con 0,05 e 0,09 e quelli <= 0,05 appariranno anche in 0,09.
Semplificato:
LA = [ 0,01 , 0,05 ,0,09]
B = [ 0,01 , 0,05 ]
C = [ 0,01 ]
Tuttavia, NON ci sarà nessun altro modello o tipo di struttura "ogni seconda riga è uguale in tutte e tre le righe".
Quindi, sì, forse c'è un modo per lavorare con le matrici e rendere l'intero processo più fluido.
A <SPAN class="token operator">=</SPAN> <SPAN class="token punctuation">[</SPAN><SPAN class="token number">1</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">2</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">3</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">4</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">5</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">6</SPAN><SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">;</SPAN>
B <SPAN class="token operator">=</SPAN> <SPAN class="token punctuation">[</SPAN><SPAN class="token number">1</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">2</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">3</SPAN><SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">;</SPAN>
C <SPAN class="token operator">=</SPAN> <SPAN class="token punctuation">[</SPAN><SPAN class="token number">3</SPAN><SPAN class="token punctuation">,</SPAN><SPAN class="token number">5</SPAN><SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">;</SPAN>
Re: Selezione del valore e copia in nuove colonne@Pacco ,
Ok, questo dovrebbe portarti al 90% del percorso.
dt = Current Data Table(); // Assuming the data table is open
/* Step 1 - add 3 columns */
dt << New Column("sign_0,09",Numeric,Continuous)
<< New Column("sign_0,05",Numeric,Continuous)
<< New Column("sign_0,01",Numeric,Continuous);
// Getting the values of column of interest
ColVals = dt:Name("p-value (two-sided test) 2") << Get Values;
// Set up a dummy matrix
Dummy = J(NRows(dt),1,.);
// All Rows
AllRows = Index(1,NRows(dt),1);
/* Step 2 - Select from the column based on conditions */
/* This could also be replaced by loop */
SR1 = dt << Select Where(:Name("p-value (two-sided test) 2") <= 0.09) << Get Selected Rows; // You can edit this to conform to european convention of 0,09
dt << Clear Select;
Dummy[SR1,0] = ColVals[SR1];
dt:Name("sign_0,09") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR2 = dt << Select Where(:Name("p-value (two-sided test) 2") <= 0.05) << Get Selected Rows; // You can edit this to conform to european convention of 0,05
dt << Clear Select;
Dummy[SR2,0] = ColVals[SR2];
dt:Name("sign_0,05") << Set Values(Dummy);
// Re-initialize dummy matrix
Dummy = J(NRows(dt),1,.);
SR3 = dt << Select Where(:Name("p-value (two-sided test) 2") <= 0.01) << Get Selected Rows; // You can edit this to conform to european convention of 0,01
dt << Clear Select;
Dummy[SR3,0] = ColVals[SR3];
dt:Name("sign_0,01") << Set Values(Dummy);
/* End of Step 2 */
/* Step 3 */
// We already have the rows that meet the conditions
Show(SR1);
Show(SR2);
Show(SR3);
/* End of Step 3 */ <BR />@Jeff_Perkinson ,
C'è un modo semplice per trovare elementi comuni tra le matrici? Forse Design() potrebbe aiutare, ma puoi fornire un esempio
A = [1,2,3,4,5,6];
B = [1,2,3];
C = [3,5];
// The common element would be 3
So che potrei usare gli array associativi e la funzionalità di intersezione, ma le matrici non dovrebbero avere un modo semplice per determinare elementi comuni/non comuni.
Re: Selezione del valore e copia in nuove colonneCiao Jeff,
Grazie anche per aver dato un'occhiata.
Ho allegato i file nella mia risposta sopra! Spero chiariscano la mia domanda.
Re: Selezione del valore e copia in nuove colonneRe: Selezione del valore e copia in nuove colonneEHI,
Grazie mille per l'input. Questo è già molto utile da sapere.
Mi dispiace per la copia errata della sceneggiatura. Lo terrò a mente per la prossima volta.
Per rendere più chiaro ciò che sto cercando di fare, allego una panoramica graduale di come dovrebbe essere il risultato. Spero che la guida dia più chiarezza.
Allego anche l'esempio in formato jmp.
Grazie per l'aiuto!
Re: Selezione del valore e copia in nuove colonneHo letto la tua descrizione di ciò che stai cercando di fare, ma ho difficoltà a capirlo senza un esempio concreto. Inoltre, poiché il tuo JSL non sta facendo quello che vorresti che facesse, è difficile usarlo per indovinare come aiutarti.
Potresti pubblicare qualche dettaglio in più su esattamente cosa stai cercando di fare, preferibilmente con schermate delle tabelle di dati in questione e cosa vorresti ottenere? Penso che questo aiuterebbe noi della Comunità ad aiutarti in modo più diretto.
Grazie.
Re: Selezione del valore e copia in nuove colonne@Pacco ,
Vediamo come posso provare ad aiutare. Per prima cosa, una richiesta da parte mia è quando si incolla il codice, si prega di incollarlo utilizzando il blocco di codice "JSL", quindi è facile per i membri della comunità leggere il codice. Ora, una volta che ci siamo occupati di questo, esaminando il tuo codice:
1. vals 1 = Select Where (:p-value (test a due code)2 <= 0,09); / /sembra che il "2" nel nome della colonna crei confusione, ma sfortunatamente ci vorrebbe molto tempo per esaminare tutte le tabelle e cambiare il nome della colonna
- Quando hai un nome complicato come questo per una colonna e non vuoi cambiarlo, sarebbe consigliabile usare name() . quindi la riga sopra dovrebbe essere riscritta come:
vals1 = Select Where (Name("p-value (two-sided test)2 ")<= 0,09); // I don't know if you are using European convention for the comma instead of decimal2. Ora, un'istruzione select where è un messaggio inviato a una tabella di dati, quindi la riga di codice precedente dovrebbe essere ulteriormente perfezionata come:
vals1 = dt << Select Where (Name("p-value (two-sided test)2") <= 0,09); Se sei così gentile da provare questi suggerimenti e magari fornire un set di dati di esempio, posso provare a risolvere anche gli altri problemi.