Come scorrere le righe da gruppi creati da 2 colonneCiao a tutti,
ho una domanda piuttosto semplice ma non riesco a trovare la risposta esatta dal forum. Ecco la mia tabella di dati di esempio:

Fondamentalmente ha 4 colonne e ho bisogno di scorrere ciascuno degli elementi combinati generati da "gruppo 1" e "gruppo 2", ma se e solo quando "elemento" # è diverso, quindi apri il percorso di tutti i file nella colonna "percorso" . Ad esempio, sulle prime 2 righe, abbiamo la combinazione "aA", e poiché anche gli elementi sono diversi, lo script deve aprire entrambi i percorsi file 1 e 2.
Miscelazione e pulizia dei datiRi: Come scorrere le righe da gruppi creati da 2 colonneSì, in realtà è stato molto utile. La variabile file_list creava confusione, poiché non è strettamente necessaria per aprire i file (ma; lo prendo; che è utile in seguito quando si chiudono nuovamente tutti i file (?), per esempio, o qualche altra manipolazione). Devo ammettere che mi ci è voluto del tempo anche per capire la variabile "file_path", che viene assegnata a un percorso di file diverso ad ogni iterazione, e che non importa come si chiama. (Nella mia testa, ora lo interpreto solo come un veicolo che seleziona un percorso di file dopo l'altro dall'elenco filepaths_to_open e consente all'utente di fare "qualcosa" con esso.)
Grazie! Ogni settimana un piccolo aumento di conoscenza è meglio di niente.
PS: Quanto di seguito sono stato in grado di scrivere solo in base alla mia comprensione delle tue spiegazioni. Ripeto, molto utile.
Names Default To Here( 1 );
filepaths_to_open = {"$SAMPLE_DATA/Big Class.jmp", "$SAMPLE_DATA/Probe.jmp", "$SAMPLE_DATA/Iris.jmp"};
For Each( {file_path}, filepaths_to_open, Open( file_path ) );
Ri: Come scorrere le righe da gruppi creati da 2 colonnePenso che quelli siano più facili da capire scrivendo uno script demo (ho modificato un po 'For Each per aggiungere idx, potrebbe rendere un po' più facile capire come funziona)
Names Default To Here(1);
filepaths_to_open = {"$SAMPLE_DATA/Big Class.jmp", "$SAMPLE_DATA/Probe.jmp", "$SAMPLE_DATA/Iris.jmp"};
show(filepaths_to_open);
file_list = {};
show(file_list);
For Each({file_path, idx}, filepaths_to_open,
show(idx, file_path);
Insert Into(file_list, Open(file_path));
show(file_list);
);
- Uso file_list per raccogliere i riferimenti alle tabelle di dati che vengono aperte (non ho bisogno dei percorsi file poiché li ho già in filepaths_to_open, ma non ho riferimenti)
- Open(file_path) restituirà un riferimento al file aperto e Insert Into aggiungerà quel riferimento a file_list.
- Il {filepath} viene da how Per ogni funzione dovrebbe essere usato. Fondamentalmente eseguirà un ciclo su filepaths_to_open e restituirà ogni elemento (uno per uno) nella variabile file_path.
filepaths_to_open = {"$SAMPLE_DATA/Big Class.jmp", "$SAMPLE_DATA/Probe.jmp", "$SAMPLE_DATA/Iris.jmp"};
file_list = {};
idx = 1;
file_path = "$SAMPLE_DATA/Big Class.jmp";
file_list = {DataTable("Big Class")};
idx = 2;
file_path = "$SAMPLE_DATA/Probe.jmp";
file_list = {DataTable("Big Class"), DataTable("Probe")};
idx = 3;
file_path = "$SAMPLE_DATA/Iris.jmp";
file_list = {DataTable("Big Class"), DataTable("Probe"), DataTable("Iris")};
Speriamo di rispondere ad alcune delle domande.
Ri: Come scorrere le righe da gruppi creati da 2 colonne@jthi , Voglio solo fare alcune domande riguardo all'ultima parte del codice, cioè, non lo capisco.
file_list = {};
For Each({file_path}, filepaths_to_open,
Insert Into(file_list, Open(file_path));
);
file_list = {};
Questa è una lista vuota. Il ciclo lo riempirà tramite Inserisci in (elenco_file, Apri (percorso_file)). Perché non si può semplicemente usare l'elenco già contenuto in filepaths_to_open? Inoltre, non capisco come Open(file_path) inserirà qualcosa nell'elenco. Non è solo una funzione per aprire un file? Come può contribuire a un elenco?
{file_path}Anche questo non lo capisco. È solo un segnaposto per i percorsi dei file effettivi?
Forse hai un riferimento che spiega queste cose? Grazie mille già in anticipo.
Ri: Come scorrere le righe da gruppi creati da 2 colonneDovrai modificare i calcoli ValidFile e possibilmente la selezione della riga a seconda di come costruisci il controllo ValidFile.
new_col = dt << New Column("ValidFile", Numeric, Continuous, << Set Each Value(
If(Col Sum(1, :g1, :g2, :i) == 1 & Col Number(:i, :g1, :g2) > 1,
1
,
0
);
));Ri: Come scorrere le righe da gruppi creati da 2 colonne@jthi , pulito, come sempre. Buon apprendimento, grazie.
Ri: Come scorrere le righe da gruppi creati da 2 colonneRiesco a trovarne uno creando un'altra colonna, "Unique":
new_col = dt << New Column("Unique", Numeric, Continuous, << Set Each Value(
Col Sum(1, :g1, :g2);
));
rows_to_open = dt << Get Rows Where(:ValidFile == 1 & :Unique != 1);
Ri: Come scorrere le righe da gruppi creati da 2 colonneGrazie jti! Un'ultima domanda, come dovrei modificare ulteriormente la formula da ignorare se quelle colonne g1, g2 e ho solo 1 combinazione di file valido?

Ri: Come scorrere le righe da gruppi creati da 2 colonneModificato il mio messaggio per rinominare la vecchia variabile. Non stiamo sommando colonne di caratteri, le stiamo usando dal raggruppamento (). E usiamo 1 così abbiamo qualcosa che aumenterà di 1 per ogni riga del gruppo. Potrebbe essere una buona idea creare diversi tipi di formule utilizzando quelle funzioni per rendere più facile la comprensione del loro funzionamento, l'indice di scripting fornisce anche alcuni esempi.
Col Somma(nome,)
Ri: Come scorrere le righe da gruppi creati da 2 colonneciao jti,
Grazie per l'ottima risposta con 3 diverse opzioni. Una delle note a margine è che devo rimuovere "1" dalla variabile rows_to_open1 per far funzionare il codice. Se puoi correggere questo errore di battitura per riferimento futuro, sarebbe fantastico!
A parte questo, ho una domanda relativa alla tua risposta. Qual è lo scopo del valore "1" in ciascuno di Col Sum, Col Cumulative Sum e Col Max(Col Sum? E non capisco perché possiamo sommare il valore del carattere dalle colonne g1 e g2?
Ri: Come scorrere le righe da gruppi creati da 2 colonneCiao Ressel,
Ho provato la tua soluzione, infatti è stampata "file path6" due volte come hai detto. Un altro problema che ho riscontrato è quando ho modificato di proposito il valore dell'elemento della riga 5 da 5 a 7 per avere 2 righe identiche, viene stampata l'ultima riga ("percorso file 6"). C'è un modo per evitarlo? Vedo che anche l'alternativa per loop da jthi ha lo stesso problema.


Ri: Come scorrere le righe da gruppi creati da 2 colonne@Ressel
Penso che sarebbe più facile ripensare la struttura del loop, ma potresti anche far funzionare quella attuale come vuoi senza doppia stampa: tieni un elenco di ciò che è stato stampato o trova una sorta di logica aggiuntiva per impedirlo dall'accadere. Penso che l'idea qui sotto dovrebbe funzionare:
For( i = 1, i <= N Items( PairedGroupList ), i++,
dt << Select Where( :PairedGroup == PairedGroupList[i] );
dtTemp = dt << Subset( Invisible, Selected Rows );
For( j = 1, j < N Rows( dtTemp ), j++,
If( dtTemp:item[j] != dtTemp:item[j + 1],
Print(dtTemp:path[j]);
If(j + 1 == N Rows( dtTemp ),
Print(dtTemp:path[j + 1]);
)
)
);
Close( dtTemp, no save );
);
Ad esempio qui non dovresti ripetere l'ultimo valore, ma controlla se il valore successivo sarebbe l'ultimo, se lo sarebbe allora stampa anche quello (se hai stampato la riga corrente).
Ri: Come scorrere le righe da gruppi creati da 2 colonneNon sono esattamente sicuro di aver compreso correttamente il problema, ma di seguito sono riportate tre diverse opzioni che utilizzano, Col Sum/Col Cumulative Sum e Col Max(ColSum())
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(8),
Compress File When Saved(1),
New Column("g1", Character, "Nominal", Set Values({"a", "a", "a", "a", "a", "c", "c", "c"})),
New Column("g2", Character, "Nominal", Set Values({"A", "A", "B", "B", "B", "A", "A", "A"})),
New Column("i", Numeric, "Continuous", Format("Best", 12), Set Values([1, 3, 2, 4, 4, 5, 7, 9])),
New Column("p",
Character,
"Nominal",
Set Values({"filepath1", "filepath2", "filepath3", "filepath4", "filepath4.1", "filepath5", "filepath6", "filepath7"})
)
);
// depending how we handle duplicated g1+g2+i we would use different formulas
// if we won't open any
new_col = dt << New Column("ValidFile", Numeric, Continuous, << Set Each Value(
Col Sum(1, :g1, :g2, :i);
));
/*
// if we open the first one
new_col = dt << New Column("ValidFile", Numeric, Continuous, << Set Each Value(
Col Cumulative Sum(1, :g1, :g2, :i);
));
*/
/*
// if we don't open g1+g2 at all
new_col = dt << New Column("ValidFile", Numeric, Continuous, << Set Each Value(
Col Max(Col Sum(1, :g1, :g2, :i), :g1, :g2)
));
*/
rows_to_open = dt << Get Rows Where(:ValidFile == 1);
filepaths_to_open = dt[rows_to_open, "p"];
show(filepaths_to_open);
// dt << Delete Column(new_col);
// To open files loop over filepaths_to_open
stop();
file_list = {};
For Each({file_path}, filepaths_to_open,
Insert Into(file_list, Open(file_path));
);

L'idea è che selezioniamo le righe in cui ValidFile è 1 e quindi apriamo quei file. Questa immagine mostra i calcoli per le tre diverse formule.
Modificare:
Corretto il vecchio riferimento righe_da_aprire1 A righe_da_aprire
Ri: Come scorrere le righe da gruppi creati da 2 colonneSi prega di esaminare NChooseK Matrix() e vedere se è giusto per te.Nell'indice di scripting è descritto come: Crea una matrice di nChooseK(n,k) righe e K colonne formando tutte le combinazioni di k interi da 1 a n.
Mi chiedo se può essere modificato per funzionare con i tipi di dati dei caratteri?
Names Default To Here( 1 );
Print( NChooseK Matrix( 5, 3 ) );
__________________________
Prints:
[ 1 2 3,
1 2 4,
1 2 5,
1 3 4,
1 3 5,
1 4 5,
2 3 4,
2 3 5,
2 4 5,
3 4 5]
Ri: Come scorrere le righe da gruppi creati da 2 colonneCiao, quanto segue almeno inizia quello che vuoi fare. Dovrai solo modificare il " Print( dtTemp:percorso[j], dtTemp:percorso[j + 1] )" parte con la funzione per aprire un file.
Sfortunatamente, tuttavia, nel modo in cui l'ho scritto, questo script stampa "file path 6" due volte nel registro, quindi aprirà anche "file path6" due volte se modificato di conseguenza. Sono sicuro che c'è un modo per aggirare il problema (come verificare se un percorso di file è già stato aperto forse), ma qui si sta facendo tardi. Ad ogni modo, se riesco a capire come fare anche il resto, ti farò sapere. Il feedback è apprezzato!
dt = New Table( "today's challenge",
Add Rows( 7 ),
New Column( "group1",
Character,
"Nominal",
Set Values( {"a", "a", "a", "a", "c", "c", "c"} )
),
New Column( "group2",
Character,
"Nominal",
Set Values( {"A", "A", "B", "B", "A", "A", "A"} ),
Set Display Width( 70 )
),
New Column( "item",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [1, 3, 2, 4, 5, 7, 9] )
),
New Column( "path",
Character,
"Nominal",
Set Selected,
Set Values(
{"file path 1", "file path 2", "file path 3", "file path 4",
"file path 5", "file path 6", "file path 7"}
)
)
);
dt << New Column( "PairedGroup", formula( :group1 || :group2 ) );
PairedGroupList = Associative Array( dt:PairedGroup ) << Get Keys;
dt << Clear Column Selection;
For( i = 1, i <= N Items( PairedGroupList ), i++,
dt << Select Where( :PairedGroup == PairedGroupList[i] );
dtTemp = dt << Subset( Invisible, Selected Rows );
For( j = 1, j <= N Rows( dtTemp ), j++,
If( dtTemp:item[j] != dtTemp:item[j + 1],
Print( dtTemp:path[j], dtTemp:path[j + 1] )
)
);
Close( dtTemp, no save );
);