Selezionando le voci delle righe duplicate, salva il loro indice e quindi crea un nuovo elenco che non contenga le righe duplicate.CIAO.
Questo fa seguito alla domanda in questo collegamento: Risolto: ottieni valori da seleziona dove - Comunità utenti JMP . Alla fine di questa discussione (nel collegamento fornito), c'è un modo un jsl che seleziona determinate righe e le stampa utilizzando la funzione show(). In un altro post (ho perso il collegamento), c'era un metodo per selezionare le righe duplicate utilizzando la funzione Seleziona riga duplicata() e quindi eliminarle.
Il mio obiettivo è selezionare le righe duplicate e quindi ottenere il loro indice per una colonna selezionata nella tabella. Ad esempio, voglio trovare le voci duplicate per la colonna dell'età nella tabella delle classi grandi.
Il secondo obiettivo è creare una nuova colonna che contenga solo righe univoche senza eliminare la riga duplicata.
Qualsiasi consiglio è apprezzato.
dt_limit = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt_limit:age << Select Duplicate Rows( Match (:age, :age ) );
Group1List = (dt_limit:age[dt_limit << get selected rows]);
theCount = N Rows( dt << get selected rows);
Show( Group1List);
Automazione e scriptingAnalisi e modellazione dei dati di baseAccesso ai datiRi: Selezionare le voci di riga duplicate, salvare il relativo indice e quindi creare un nuovo elenco che non contenga le righe duplicate.Grazie @Jed_Campbell . Questo va bene, grazie mille!
Sto cercando di catturare quella colonna in un elenco per ulteriori azioni. Saresti in grado di aiutarmi in questo? Grazie!
Ri: Selezionare le voci di riga duplicate, salvare il relativo indice e quindi creare un nuovo elenco che non contenga le righe duplicate.Questa riga aggiunta alla fine del tuo script dovrebbe inserire quella colonna in un elenco:
future_list = as list (dt_limit:Unique << Get Values);
Ri: Selezionare le voci di riga duplicate, salvare il relativo indice e quindi creare un nuovo elenco che non contenga le righe duplicate.Grazie @Jed_Campbell . Funziona perfettamente.
Un altro problema che sto riscontrando in questo momento è che cosa accadrebbe se invece di avere una colonna, ad esempio età, avessi un elenco di colonne, ad esempio [età, altezza, peso, ecc.]. Come cambierebbe il codice? Ho provato a utilizzare una combinazione di colonne ed eval per recuperare la voce dell'elenco come colonna. So che il codice seguente funziona, ma come lo modificherei per farlo funzionare con qualsiasi elenco di colonne. Avrebbe qualcosa come As colonna (ListOfTargetCol[i])[i] ); OPPURE :(ListOfTargetCol[i])[i] ); significa che jmp recupererà la i-esima voce dell'elenco e quindi recupererà quella colonna (la colonna) i-esima voce? Sono nuovo in JSL e non sono sicuro di come sia strutturato. Si prega di consigliare come superare questo problema.
Per riferimento, sto utilizzando un codice simile a quello che hai fornito sopra e ho provato ad aggiungere qualcosa del genere: sono anche curioso di sapere se sarà diverso se si tratta di un elenco di nomi di una stringa come quelli seguenti. Molte grazie!
ListOfTargetCol = { age, height, weight};
StringOfTargetCol = { "age", "height", "weight"};
... dt_limit:Unique[i] = dt_limit:( As coulmn(ListOfTargetCol[1])) [i]...
Ri: Selezionare le voci di riga duplicate, salvare il relativo indice e quindi creare un nuovo elenco che non contenga le righe duplicate.È qualcosa del genere quello che stai cercando? Potrebbero esserci modi più eleganti per realizzarlo, ma ecco un modo per creare una nuova colonna con solo la prima riga univoca.
dt_limit = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt_limit << Select Duplicate Rows( Match (:age ) );
Group1List = (dt_limit << get selected rows);
theCount = N Items (Group1List);
//create a new column that has only the unique rows without deleting the duplicated row
dt_limit << Invert Row Selection;
UniqueList = dt_limit << Get Selected Rows;
dt_limit << new column ("Unique");
for each ({i}, UniqueList,
dt_limit:Unique[i] = dt_limit:age[i]
);Ri: Selezionare le voci di riga duplicate, salvare il relativo indice e quindi creare un nuovo elenco che non contenga le righe duplicate.Se non ti servono le selezioni puoi anche usare formula/riepilogo (o tante altre opzioni)
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Option1
new_col = dt << New Column("R1", Numeric, Continuous, Formula(
If(Row() == Col Min(Row(), :age), :age, .)
));
dt << Run Formulas;
new_col << Delete Formula;
// Option2
dt << New Column("Row", Numeric, "Continuous", Formula(Row()));
dt_summary = dt << Summary(
Group(:age),
Min(:Row),
Freq("None"),
Weight("None"),
statistics column name format("column"),
Link to original data table(0)
);
dt_summary << Delete Columns("N Rows");
Column(dt_summary, 1) << Set Name("R2");
dt << Update(With(dt_summary), Match Columns(:Row = :Row));
Close(dt_summary, no save);

Re: Selezione delle voci di riga duplicate, salvataggio del loro indice e creazione di un nuovo elenco che non contenga le righe duplicate.Grazie @jthi per il tuo aiuto! Entrambe le soluzioni funzionano bene, ma sono ancora confuso sulla sintassi che dovrei usare.
In the loop below, we have the dt:age[i] which iterates through the "age" column in the dt_limit loop. <BR />What if I want to have more than one column to iterate through.<BR /><BR /> The only solution I can find (and works with no error) is to copy past the loop for <BR />all the needed columns i.e. age, height, ..etc. It is just not efficient and will not work for a large number of columns. <BR /><BR />Any suggestions would be appreciated.
<BR />
for each ({i}, UniqueList,
dt_limit:Unique[i] = dt_limit:age[i]
);Re: Selezione delle voci di riga duplicate, salvataggio del loro indice e creazione di un nuovo elenco che non contenga le righe duplicate.Non sono sicuro di cosa stai cercando di fare. Puoi aggiungere altre colonne a Col Min come byvars
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Option1
new_col = dt << New Column("R1", Numeric, Continuous, Formula(
If(Row() == Col Min(Row(), :age, :sex), :age, .)
));
dt << Run Formulas;
new_col << Delete Formula;

Col minimo(nome, )
Re: Selezione delle voci di riga duplicate, salvataggio del loro indice e creazione di un nuovo elenco che non contenga le righe duplicate.Grazie @jthi . Vero. Posso semplicemente aggiungere altre colonne come hai suggerito sopra. Tuttavia, sto cercando di generalizzare la soluzione. Quello che sto cercando di fare è prendere l'input dell'utente per le colonne da valutare. Metterle in un elenco. E poi, valutarle tutte. Ad esempio, l'utente può scegliere solo età e altezza. Ho bisogno che il codice sia il più flessibile possibile.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Option1
TargetList = {age, sex, height};
new_col = dt << New Column("R1", Numeric, Continuous, Formula(
If(Row() == Col Min(Row(), :age, :sex), :age, .)
));
dt << Run Formulas;
new_col << Delete Formula;Re: Selezione delle voci di riga duplicate, salvataggio del loro indice e creazione di un nuovo elenco che non contenga le righe duplicate.È possibile costruire la formula con le espressioni
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
sel_cols = {"age", "sex", "height"};
colmin_expr = Expr(Col Min(Row()));
For Each({sel_col}, sel_cols,
Insert Into(colmin_expr, Name Expr(AsColumn(dt, sel_col)))
);
Eval(Substitute(
Expr(new_col = dt << New Column("R1", Numeric, Continuous, Formula(
If(Row() == _colminformula_, :age, .)
))),
Expr(_colminformula_), Name Expr(colmin_expr)
));
dt << Run Formulas;
new_col << Delete Formula;
Dovresti anche essere in grado di modificare abbastanza facilmente la versione Riepilogo per lavorare con gli input da un elenco