Ciao a tutti,
La mia domanda è duplice. I miei dati appaiono più o meno così:
| 1-A | X | sì | . | . | . | . |
| 1-A | . | . | z | Q | . | . |
| 1-A | . | . | . | . | w | w |
| 2-B | sì | w | . | . | . | . |
| 2-B | . | . | T | sì | . | . |
| 2-B | . | . | . | . | Q | P |
Vorrei A) eliminare i punti dati vuoti e
raggruppare le righe in base all'identificatore nella prima colonna che ogni riga ha in comune (ovvero 1-A e 2-B).
Vorrei che il mio risultato finale fosse simile a questo:
Qualcuno ha qualche suggerimento su come affrontare questo problema per una tabella di grandi dimensioni con centinaia di valori?
Grazie in anticipo,
Charlie
È il momento dei pezzi grossi.Ecco uno script che dovrebbe funzionare.Fondamentalmente il modo in cui funziona è scorrere tutte le righe e le colonne.Se la riga successiva ha lo stesso ID, trasmette i valori non mancanti alla riga successiva.Entro l'ultima riga di un determinato ID, tutti i valori non mancanti dovrebbero trovarsi in quella riga.Nell'ultimo passaggio, elimini tutte le righe extra.
dt = Current Data Table();
dt << New Column( "Delete Later", character, formula( If( :ID[Row()] == :ID[Row() + 1], "Yes", "No" ) ) );
for(i=1,i<=N Row(dt),i++, //iterate through each row
//If next row has same ID, pass non-missing values down to next row
If(:Delete Later[i] == "Yes",
for(j=2,j<= (N Col(dt) - 1),j++, //iterate through each column (except ID and Delete Later)
//pass non-missing data down to next row
if(!isMissing(Column(dt,j)[i]), Column(dt,j)[i+1] = Column(dt,j)[i])
)
)
);
//Collapse all the extra rows
dt << Select Where(:Delete Later == "Yes") << Delete Rows();
Questo ha funzionato perfettamente per il tuo esempio.Dovrebbe funzionare per la tua tabella, anche se se hai milioni di righe, il completamento potrebbe richiedere molto tempo.Questo script presuppone inoltre che la colonna sia denominata "ID" e che tutte le altre colonne debbano avere valori non mancanti per solo 1 riga per ciascun ID.
Tabella di partenza che ho usato per testare lo script:
Tavolo finale:
Script per ricreare la mia tabella di partenza:
New Table( "ConsolidateTable",
Add Rows( 6 ),
New Column( "ID",
Character( 3 ),
"Nominal",
Set Values( {"1-A", "1-A", "1-A", "2-B", "2-B", "2-B"} ),
Set Display Width( 87 )
),
New Column( "Column 2",
Character( 16 ),
"Nominal",
Set Values( {"x", "", "", "y", "", ""} ),
Set Display Width( 87 )
),
New Column( "Column 3",
Character( 16 ),
"Nominal",
Set Values( {"y", "", "", "w", "", ""} ),
Set Display Width( 87 )
),
New Column( "Column 4",
Character( 16 ),
"Nominal",
Set Values( {"", "z", "", "", "t", ""} ),
Set Display Width( 87 )
),
New Column( "Column 5",
Character( 16 ),
"Nominal",
Set Values( {"", "q", "", "", "y", ""} ),
Set Display Width( 87 )
),
New Column( "Column 6",
Character( 16 ),
"Nominal",
Set Values( {"", "", "w", "", "", "q"} ),
Set Display Width( 87 )
),
New Column( "Column 7",
Character( 16 ),
"Nominal",
Set Values( {"", "", "w", "", "", "p"} ),
Set Display Width( 87 )
)
)Sfortunatamente questa tabella ha più di 1000 colonne. Grazie per il suggerimento, ma non mi sembra fattibile.
Ora, supponiamo che io voglia ignorare i dati vuoti e occuparmene in un secondo momento. Come consoliderei le righe?Speriamo che questo passo sia più fattibile.
Se non hai troppe colonne, potresti prima renderle tutte caratteri, usare i passaggi che ho consigliato e poi riconvertire le colonne numeriche.Se la tua tabella è molto più ampia del tuo esempio, questo potrebbe non essere molto fattibile.
Purtroppo i dati sono misti: categorici, binari, numerici, testo libero. Sto cercando di semplificare il database e rimuovere le voci vuote non necessarie. Grazie per il suggerimento, ma non credo che funzionerà per questo scenario.
Se i dati sono numerici, esclusa la prima colonna, puoi semplicemente utilizzare
Tabelle==>Riepilogo
e specificare di generare una media o una somma per le colonne in questione
Grazie per la pronta risposta. Dovrei aggiungere che ho sorvolato su gran parte dei dettagli nella mia tabella attuale: ad esempio, quando provo il passaggio n. 1, JMP mi dice "Impossibile impilare. Le colonne in pila hanno tipi di dati diversi".
C'è un modo per impilare colonne di vari tipi di dati?
Il modo più indolore per farlo sarebbe:
1. Impila tutte le colonne tranne la colonna ID in modo che siano tutte consolidate in un'unica colonna di dati (la colonna Etichetta risultante mantiene la tracciabilità).
2. Elimina tutte le righe con valori mancanti nella nuova colonna di dati. Modo semplice: seleziona un valore mancante > fai clic con il pulsante destro del mouse su di esso > seleziona celle corrispondenti > fai clic con il pulsante destro del mouse > elimina righe.
3. Esegui una divisione della tabella per tornare alla forma originale della tabella dati. La colonna divisa è la nuova colonna di dati. Dividi per è la nuova colonna dell'etichetta e puoi raggruppare in base alla colonna ID.