Ho una tabella dati a più colonne (caratteri, nominali). Voglio inserire le voci/elementi nelle ultime quattro colonne in una nuova colonna nella stessa tabella dati ignorando voci/elementi duplicati dalle colonne impilate. Come ottenere questo risultato in JSL?
Senza sapere come appaiono i tuoi dati e come dovrebbero apparire, alla fine, la mia ipotesi migliore è usare la combinazione di Array associativo() << Ottieni chiavi E Concatena elementi()
@jthi Grazie. Ma questo elimina i duplicati?
Le mie colonne (da impilare) hanno voci Char comuni tra loro ma anche voci univoche. Voglio mantenerli ciascuno nella nuova colonna eliminando i duplicati.
Array associativi non può avere chiavi duplicate, quindi sì (è anche ordinato, quindi l'ordine potrebbe cambiare).
Ecco alcuni modi per farlo:
- Operazioni sulla tabella:
- Impila le colonne in una colonna utilizzando Tabelle > Impila
- Utilizza Tabelle > Riepilogo con la colonna in pila come ruolo Gruppo
- JSL
- Ottieni i valori delle colonne in un elenco
- lista_di_valori = colonna(nome tabella, nome colonna) << ottieni valori
- Puoi farlo di nuovo su un'altra colonna e inserire quei valori nell'elenco
- lista_di_valori = Inserisci in(lista_di_valori, colonna(nome tabella, altro nome colonna) << ottieni valori)
- ripetere se necessario
- Utilizza un array associato per ottenere valori univoci
- valori_unici = (Array associativo(lista_di_valori)) << ottieni chiavi
- inserisci l'elenco di valori in una nuova colonna in una tabella di dati
Names Default To Here( 1 );
// create table with 4 columns with random letters
nr = 20;
dt = New Table( "Example", addrows( nr ) );
letterlist = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q",
"R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
dt << New Column( "C1", character );
Column( dt, "C1" ) << set values( letterlist[J( nr, 1, Random Integer( 26 ) )] );
dt << New Column( "C2", character );
Column( dt, "C2" ) << set values( letterlist[J( nr, 1, Random Integer( 26 ) )] );
dt << New Column( "C3", character );
Column( dt, "C3" ) << set values( letterlist[J( nr, 1, Random Integer( 26 ) )] );
dt << New Column( "C4", character );
Column( dt, "C4" ) << set values( letterlist[J( nr, 1, Random Integer( 26 ) )] );
// Method 1
dtstack = dt << Stack(
columns( :C1, :C2, :C3, :C4 ),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
Output Table( "Stacked Values" )
);
dtstack << Summary(
Group( :Data ),
Freq( "None" ),
Weight( "None" ),
output table name( "Unique Values" )
);
//Method 2
list_of_values = Column( dt, "C1" ) << get values;
Insert Into( list_of_values, Column( dt, "C2" ) << get values );
Insert Into( list_of_values, Column( dt, "C3" ) << get values );
Insert Into( list_of_values, Column( dt, "C4" ) << get values );
Print( list_of_values );
unique_values = (Associative Array( list_of_values )) << get keys;
dtunique = New Table( "Unique Values" );
dtunique << New Column( "Unique Values", character );
Column( dtunique, "Unique Values" ) << set values( unique_values );
@jthi OK. Grazie. È questa la sintassi corretta?
aa = Associative Array( As Column(lastCH), As Column(2ndLastCH), As Column(3rdLastCH), As Column(4rthLastCH)) << get keys();
// Where "lastCH", "2ndlastCH", "3rdlastCH" and "4rthlastCH" are column headers for the last four columns in my data table, supplied from above
@SamGardner
Entrambi funzionano bene, ma aggiungono una riga vuota se il numero di righe non è lo stesso per ogni colonna come nel caso del mio set di dati effettivo.
se inserisci il codice
remove from(unique_values, loc(unique_values,"")[1])
dopo la riga in cui viene creato l'elenco unique_values, ciò rimuoverà il valore dall'elenco che è la stringa vuota.
remove from(unique_values, 1)
dovrebbe funzionare, poiché le chiavi sono ordinate alfabeticamente in base alla richiesta.