Filtra per riga, impila le colonne?So come creare una tabella di sottoinsiemi in base ad alcuni criteri:
dt << Row Selection( Select where( (:Stat == "mean"), Current Selection( Extend )) );
dt << Select Columns( [10, 20] );
dt2 << Subset( Output Table( "test"), Selected Rows( 1 ), Selected columns( 1 ) );
Ma ora devo ripetere quanto sopra per più criteri e impilare la selezione, ovvero la nuova tabella avrà la colonna 10 come colonna fissa, quindi continuo ad aggiungere la colonna 20 solo con le righe che corrispondono ai criteri sopra. Il numero di righe sarà sempre lo stesso.
Il comando "Stack" non funziona con la selezione, quindi non sono sicuro di quali altri comandi possano farlo?
Combinazione e pulizia dei datiRi: Filtrare per riga, impilare colonne?In realtà è quello che volevo, grazie ancora!
Ri: Filtrare per riga, impilare colonne?Ripensando a ciò che immagino sia l'output del tavolo finale desiderato, ti suggerisco di dare un'occhiata
Tabelle=>Dividi
L'esempio seguente è diviso per la colonna :Sex, sarebbe la tua colonna :Freq, e le colonne Split sono Height e Weight, che sarebbero le tue 15 e 19 colonne.
L'output crea coppie di colonne per ciascuno dei valori della colonna Dividi per
Names Default To Here( 1 );
dt = open("$SAMPLE_DATA\big class.jmp");
// Split data table
// → Data Table( "Untitled 66" )
Data Table( "big class" ) << Split(
Split By( :Sex ),
Split( :height, :weight ),
Remaining Columns( Drop All ),
Sort by Column Property
);

Ri: Filtrare per riga, impilare colonne?Grazie, era corretto! L'unica cosa che rimane è come metterlo in un ciclo for. Ecco la mia prova:
For(i=1, i<=NItems(freq_list), i++,
dt << clear select;
dt << Row Selection( Select where( (:Freq == (freq_list[i])), Current Selection( Extend )) );
dt << Select Columns( [15,19] );
dt << Subset( ( Selected Columns ), Output Table Name( freq_list[i] ) );
);
Ma questo produce due tabelle identiche anche se cancello la selezione all'inizio di ogni ciclo.
Ri: Filtrare per riga, impilare colonne?Sospetto che il problema sia che le colonne in entrambe le tabelle hanno gli stessi nomi.Pertanto, JMP sovrascriverà i valori.Ecco un semplice esempio su come lo gestirei.Ora, dato questo tipo di Update, le due tabelle dati saranno allineate, riga 1 con riga 1.
Ciò potrebbe comportare il problema che non è possibile confrontare le colonne, poiché la relazione tra loro non esiste.
dt << Row Selection( Select where( (:Freq == "F0"), Current Selection( Extend )) );
dt << Select Columns( [15,19] );
dt2 = dt << Subset( ( Selected Columns ), Output Table Name( "F0" ) );
dt << clear select;
dt << Row Selection( Select where( (:Freq == "F1"), Current Selection( Extend )) );
dt << Select Columns( [15,19] );
dt3 = dt << Subset( ( Selected Columns ), Output Table Name( "F1" ) );
// Rename the columns
column(dt3,1) <<SET name=""></SET>
Ri: Filtrare per riga, impilare colonne?Mi scuso per i tanti post. Sono ancora bloccato. In questo momento tutto quello che ho è questo script che si traduce in due tabelle, ciascuna con una colonna che mi interessa. Sono in grado di copiare e incollare manualmente una colonna dalla tabella 1 alla tabella 2, ma non posso farlo automaticamente.
dt << Row Selection( Select where( (:Freq == "F0"), Current Selection( Extend )) );
dt << Select Columns( [15,19] );
dt << Subset( ( Selected Columns ), Output Table Name( "F0" ) );
dt << clear select;
dt << Row Selection( Select where( (:Freq == "F1"), Current Selection( Extend )) );
dt << Select Columns( [15,19] );
dt << Subset( ( Selected Columns ), Output Table Name( "F1" ) );
Ri: Filtrare per riga, impilare colonne?No, il codice sopra è ancora concatenato. Proverò il comando "aggiorna".
Ri: Filtrare per riga, impilare colonne?Ecco un codice che sembra funzionare, manualmente. Ora proverò a farlo in un ciclo:
dt << Row Selection( Select where( (:Stat == "selection1"), Current Selection( Extend )) );
dt << Select Columns( [15, 19] );
dt << Row Selection( Select where( (:Stat == "selection2"), Current Selection( Extend )) );
dt << Select Columns( [15, 19] );
dt << Subset( ( Selected Columns ), Output Table Name( "Subset_1_2" ) );
Ri: Filtrare per riga, impilare colonne?Per non concatenare, ma piuttosto per aggiungere nuove colonne, usa semplicemente la piattaforma di aggiornamento.
Ri: Filtrare per riga, impilare colonne?Grazie, è quasi quello che voglio, tranne per il fatto che ho bisogno che siano impilati (per colonna) invece che concatenati (per riga). Cioè, se la colonna di selezione è lunga L, voglio che la mia nuova tabella abbia lo stesso numero di righe, ma due colonne (non una colonna del doppio della lunghezza).Ri: Filtrare per riga, impilare colonne?Inserire() non fa quello che sembra tu pensi che faccia.
Nel tuo codice inserirà ripetutamente il riferimento alla tabella dati dt nell'elenco dtstacked. Non ha nulla a che fare con le righe o le colonne selezionate.
Dovrai creare una nuova tabella di dati delle righe e delle colonne selezionate utilizzando Subset() e inserire quel riferimento in dtstacked e quindi concatenarle.
Tuttavia, ciò non sembra necessario. Dal momento che stai solo estendendo la selezione ogni volta attraverso il ciclo alla fine, potresti fare un sottoinsieme delle righe e delle colonne selezionate e ottenere lo stesso risultato della tua tabella di dati concatenata.
Ri: Filtrare per riga, impilare colonne?Grazie, ma non ha funzionato:
dt = current data table();
my_list = {"F0","F1"};
dtBase = New Table("Base");
dtStacked = {};
For( i = 1, i <= N Items( my_list ), i++,
dt << Row Selection( Select where( (:Freq==my_list[i]), Current Selection( "Extend" )) );
dt << Select Columns( [19] );
Insert Into( dtStacked, dt );
dtBase << Concatenate( dtStacked );
Close( dtStacked, nosave );
);dtBase è vuoto.
Ri: Filtrare per riga, impilare colonne?Ah..... hai ragione sull'eliminazione delle righe selezionate.Ma per eliminare i non selezionati, basta usare
dtStack << Invert Row Selection;
e quindi eliminare le righe.
Per aggiungere più tabelle di dati in pila indipendenti, semplicemente:
- Prima di avviare le istanze Stack ripetute, crea una tabella di dati Base vuota che finirà per avere tutte le tabelle in pila concatenate ad essa
dtBase = New Table("Base");
- Quindi, per ciascuna delle tabelle in pila che crei,
- Elimina le righe che non desideri dalla tabella dei dati in pila
- Concatena la tabella Stacked alla tabella Base
dtBase << Concatenate( dtStacked );
- Elimina la tabella impilata
Close( dtStacked, nosave );
Ri: Filtrare per riga, impilare colonne?Ecco come pensavo si potesse fare (ma non funziona):
my_list = {"F0","F1"};
stackcols = {};
For( i = 1, i <= N Items( my_list ), i++,
dt << Row Selection( Select where( (:Freq==my_list[i]), Current Selection( "Extend" )) );
dt << Select Columns( [19] );
Insert Into( stackcols, dt )
);
dt2 << Subset( Output Table( "aa"), Selected Rows( 1 ), Selected columns( 1 ) );Fondamentalmente, filtro la tabella attiva in base alla colonna "Freq", prima per il valore "F0" e poi per "F1". Si trova nella colonna 19. Aggiungo quella selezione all'elenco di selezione chiamato "stackcols". Quindi, dopo il ciclo, mi aspetto che questo sia un elenco di due colonne. Quindi voglio ricavarne un tavolo (chiamato "aa"). Ma non sta funzionando.
Ri: Filtrare per riga, impilare colonne?(Premi accetta come soluzione per errore)
Grazie ma non voglio eliminare le righe selezionate. Posso occuparmene, ma come aggiungerei la selezione quando utilizzo Stack?Ri: Filtrare per riga, impilare colonne?Ecco un esempio di un modo semplice per eliminare le righe selezionate quando si utilizza la piattaforma Stack
names default to here(1);
// Open Data Table: Big Class.jmp
// → Data Table( "Big Class" )
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << Row Selection( Select where( (:Sex=="F"), Current Selection( "Extend" )) );
// Stack data table
dtStack = dt << Stack(
columns( :height, :weight ),
Source Label Column( "Label" ),
Stacked Data Column( "Data" )
);
dtStack << delete rows;