Problema della tabella dati divisa<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Sto riscontrando un problema con la suddivisione di una tabella dati e mi chiedevo se qualcuno sa come farlo. I miei dati appaiono così:

I dati dovrebbero essere divisi per ID2 con ID essendo la variabile del gruppo. Quando lo faccio in questo modo mi ritrovo con questo risultato:

Il problema è che per ID s 2 e 4 ci sono più valori di C nella colonna ID2 . A quanto pare JMP utilizza sempre l'ultimo valore nella tabella dei dati suddivisi.
Esiste un modo automatico per farlo in modo da ottenere una tabella come la seguente?

Qui ci sono due righe per gli ID 2 e 4 che rappresentano i diversi valori di C nei dati originali.
Grazie per l'aiuto!
Sebastian
Ri: Problema della tabella dati divisaGrazie msharp ,
funziona alla grande.
e stai scrivendo, mantenere le cose semplici è probabilmente il modo migliore per procedere.
Ri: Problema della tabella dati divisaVorrei stare lontano da questo approccio in generale, i dati statici sono generalmente più sicuri dei dati dinamici. Devi chiederti quanto è importante l'ordine dei dati?Questa soluzione manterrà le chiavi in ordine, ma i valori saranno liberi di vagare.MA...
Questa soluzione funzionerà solo con colonne numeriche.Se dovessimo sostituire :ID2 con :ID2Num dove A = 1, B = 2 ect. potresti semplicemente usare un'istruzione &, quindi :Sum( :ID[Index( 1, Row() )] == :ID & :ID2Num[Index( 1, Row() )] == :ID2Num ) per la formula.
Se hai colonne di caratteri dovrai essere più creativo.Quindi per la formula:
lunghezza(concatena elementi(:ID2[Indice( 1, Riga() )],"")) - lunghezza(sostituto(concatena elementi(:ID2[Indice( 1, Riga() )],""), :ID2, ""))
O
dt1 << Nuova colonna("Concat", Carattere, Nominale, Formula(:ID2 || char(:ID)));
dt1 << Nuova colonna("Ripeti", Carattere, Nominale, Formula((lunghezza(concat elementi(:Concat[Indice( 1, Riga() )],"")) - lunghezza(sostituto(concat elementi(:Concat[ Index( 1, Row() )],""), :Concat,"")))/2)); //il 2 alla fine rappresenta la lunghezza della stringa concatenata
Stanno succedendo molte cose qui e non ho l'energia per spiegarle adesso.Ma fammi sapere se hai domande; in realtà, sopra c'è una soluzione più semplice e praticabile.
Ri: Problema della tabella dati divisaGrazie msharp ,
a proposito, in un post precedente @ms ha offerto questa formula per l'indicizzazione :Sum( :ID[Index( 1, Row() )] == :ID ) @SM ha offerto questa formula per l'indicizzazione :Sum( :ID[Index( 1, Row() )] == :ID )
Ri: Sintassi: come posso creare una colonna di indice in base all'ID
c'è un modo per usarlo in questo contesto? con due colonne dell'indice e una di queste è alfabetica?
migliore,
Ron
Ri: Problema della tabella dati divisaSto solo combinando/riassumendo ciò che è stato menzionato. Assicurati di ordinare i dati in anticipo altrimenti la funzione Lag() avrà problemi.Inoltre, l'utilizzo di una formula sarà più veloce del comando for each row().Se sei preoccupato per l'ordinamento dei post che potrebbe influenzare la funzione lag() in seguito, elimina semplicemente la formula per evitare conflitti.Così:
NomiDefaultToHere ( 1 ) ;
// Tavolo
dt1 = Nuova tabella ( "Sebastian" ,
Nuova colonna ( "ID" ,
Numerico ,
"Nominale" ,
Formato ( "Migliore" , 12 ) ,
Imposta valori ( [ 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 2 , 2 ] )
) ,
Nuova colonna ( "ID2" ,
Carattere ,
"Nominale" ,
Imposta valori (
{ "UN" , "B" , "C" , "D" , "UN" , "B" , "C" , "C" , "UN" , "B" , "C" , "D" , "UN" , "B" ,
"C" , "C" , "C" , "B" }
)
) ,
Nuova colonna ( "Valore" ,
Numerico ,
"Nominale" ,
Formato ( "Migliore" , 12 ) ,
Imposta valori (
[ 111 , 222 , 333 , 444 , 111 , 222 , 333 , 555 , 111 , 222 , 555 , 444 , 111 , 222 ,
555 , 666 , 777 , 888 ]
)
)
) ;
// la tabella deve essere ordinata affinché la formula nel passaggio successivo funzioni
dt1 << Ordinare ( Sostituisci tabella ,
Di ( : ID , : ID2 ) ,
Ordine ( Ascendente , Ascendente )
) ;
// Aggiunge una colonna ausiliaria
dt1 << Nuova colonna ( "Ripetere" ,
Numerico ,
"Nominale" ,
Formato ( "Migliore" , 12 ) ,
Formula ( Se ( : ID2 != Ritardo ( : ID2 , 1 ) | Riga () == 1 , 1 , Ritardo ( : Ripetere , 1 ) + 1 ) )
) ;
: Ripetere << Elimina formula ; // più veloce di 'per ogni riga()'
// Diviso
dt2 = dt1 << Diviso (
Diviso per ( : ID2 ) ,
Diviso ( : Valore ) ,
Gruppo ( : ID , : Ripetere )
) ;
// Elimina un ausiliario colonna
dt2 << deleteColumn ( : Ripetere ) ;
Ri: Problema della tabella dati divisaCIAO sebastianhoffmeister ,
prova questo:
dt = Nuova tabella ( "Dati originali" ,
Aggiungi righe ( 16 ) ,
Nuova colonna ( "ID" ,
Numerico ,
Continuo ,
Formato ( "Migliore" , 12 ) ,
Imposta valori ( [ 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 ] )
) ,
Nuova colonna ( "ID2" ,
Carattere ,
Nominale ,
Imposta valori (
{ "UN" , "B" , "C" , "D" , "UN" , "B" , "C" , "C" , "UN" , "B" , "C" , "D" , "UN" , "B" ,
"C" , "C" }
)
) ,
Nuova colonna ( "Valore" ,
Numerico ,
Continuo ,
Formato ( "Migliore" , 12 ) ,
Imposta valori (
[ 111 , 222 , 333 , 444 , 111 , 222 , 333 , 555 , 111 , 222 , 555 , 444 , 111 , 222 ,
555 , 666 ]
)
)
) ;
// la tabella deve essere ordinata affinché la formula nel passaggio successivo funzioni
dt << Ordinare ( Sostituisci tabella ,
Di ( : ID , : ID2 ) ,
Ordine ( Ascendente , Ascendente )
) ;
// introduce un nuovo indice che riconoscerà le duplicazioni
dt << nuova colonna ( "ID3" ) ;
per ogni riga ( Se ( // non utilizza una formula nella colonna poiché dipende dall'ordinamento che potrebbe cambiare in seguito.
Riga () == 1 , ID3 =: ID ,
: ID != Ritardo ( : ID , 1 ) | : ID2 != Ritardo ( : ID2 , 1 ) , ID3 = : ID ,
ID3 = Ritardo ( : ID3 , 1 ) + 1
)) ;
// ora puoi dividere la tabella
dtsorted = dt << Diviso (
Diviso per ( : ID2 ) ,
Diviso ( : Valore ) ,
Gruppo ( : ID3 , : ID ) ,
Tabella di uscita ( "tavolo diviso" )
) ;
migliore,
Ron
Ri: Problema della tabella dati divisaOps! Scusa, sì, Sebastiano. Forse qualcosa del genere?
// Aggiunge una colonna ausiliaria
Aspettare ( 3 ) ;
dt1 << Nuova colonna ( "Ripetere" ,
Numerico ,
"Nominale" ,
Formato ( "Migliore" , 12 ) ,
Formula ( Se ( : ID2 != Ritardo ( : ID2 , 1 ) | Riga () == 1 , 1 , Ritardo ( : Ripetere , 1 ) + 1 ) )
) ;
Ri: Problema della tabella dati divisaGrazie per il supporto Ian!
Era più o meno quello che stavo facendo. Il problema nel mondo reale è ovviamente che il set di dati ha circa 3k righe e non riesco a immaginare una formula per creare la colonna di ripetizione automaticamente anziché manualmente.
Conosci una soluzione anche per questo? Vorrei evitare di scrivere uno script che annidi più cicli for per generare la colonna "ripeti". Sembra così inefficiente.
Grazie,
Sebastian
Ri: Problema della tabella dati divisaPenso che tu abbia bisogno di una colonna ausiliaria, Sebastian.
NomiDefaultToHere ( 1 ) ;
// Tavolo
dt1 = Nuova tabella ( "Sebastian" ,
Aggiungi righe ( 16 ) ,
Nuova colonna ( "ID" ,
Numerico ,
"Nominale" ,
Formato ( "Migliore" , 12 ) ,
Imposta valori ( [ 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 ] )
) ,
Nuova colonna ( "ID2" ,
Carattere ,
"Nominale" ,
Imposta valori (
{ "UN" , "B" , "C" , "D" , "UN" , "B" , "C" , "C" , "UN" , "B" , "C" , "D" , "UN" , "B" ,
"C" , "C" }
)
) ,
Nuova colonna ( "Valore" ,
Numerico ,
"Nominale" ,
Formato ( "Migliore" , 12 ) ,
Imposta valori (
[ 111 , 222 , 333 , 444 , 111 , 222 , 333 , 555 , 111 , 222 , 555 , 444 , 111 , 222 ,
555 , 666 ]
)
)
) ;
// Aggiunge una colonna ausiliaria
Aspettare ( 3 ) ;
dt1 << Nuova colonna ( "Ripetere" ,
Numerico ,
"Nominale" ,
Formato ( "Migliore" , 12 ) ,
Imposta valori ( [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 ] )
) ;
// Diviso
dt2 = dt1 << Diviso (
Diviso per ( : ID2 ) ,
Diviso ( : Valore ) ,
Gruppo ( : ID , : Ripetere )
) ;
// Elimina la colonna ausiliaria
Aspettare ( 3 ) ;
dt2 << deleteColumn ( : Ripetere ) ;