J'ai un tableau de données à plusieurs colonnes (caractères, nominaux). Je souhaite obtenir les entrées/éléments des quatre dernières colonnes dans une nouvelle colonne de la même table de données en ignorant les entrées/éléments en double des colonnes empilées. Comment y parvenir en JSL ?
Sans savoir à quoi ressemblent vos données et à quoi elles devraient ressembler à la fin, ma meilleure hypothèse est d'utiliser une combinaison de Tableau associatif() << Obtenir les clés et Concaténer des éléments()
@jthi Merci. Mais est-ce que cela supprime les doublons ?
Mes colonnes (à empiler) ont des entrées Char communes entre elles mais aussi des entrées uniques. Je veux garder chacun dans la nouvelle colonne en supprimant les doublons.
Tableaux associatifs ne peut pas avoir de clés en double, donc oui, ce sera le cas (il est également ordonné, donc l'ordre peut changer).
Voici quelques façons de procéder :
- Opérations sur les tableaux :
- Empilez les colonnes en une seule colonne en utilisant Tables > Pile
- Utilisez Tableaux > Résumé avec cette colonne empilée comme rôle de groupe
- JSL
- Obtenir les valeurs des colonnes dans une liste
- list_of_values = column(nom de la table, nom de la colonne) << obtenir les valeurs
- Vous pouvez refaire cette opération sur une autre colonne et insérer ces valeurs dans la liste
- list_of_values = Insérer dans (list_of_values, colonne (nom de la table, un autre nom de colonne) << obtenir les valeurs)
- répéter si nécessaire
- Utilisez un tableau associé pour obtenir les valeurs uniques
- unique_values = (Associative Array(list_of_values)) << obtenir les clés
- mettre cette liste de valeurs dans une nouvelle colonne dans un tableau de données
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 D'ACCORD. Merci. Est-ce la bonne syntaxe ?
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
Ces deux éléments fonctionnent correctement, mais ajoutent une ligne vide si le nombre de lignes n'est pas le même pour chaque colonne que dans le cas de mon ensemble de données réel.
si vous insérez le code
remove from(unique_values, loc(unique_values,"")[1])
après la ligne où la liste unique_values est créée, cela supprimera la valeur de la liste qui est la chaîne vide.
remove from(unique_values, 1)
devrait également fonctionner, puisque les clés sont triées par ordre alphabétique lorsqu'elles sont demandées.