Tengo una tabla de datos de varias columnas (caracteres, nominales). Quiero obtener las entradas/elementos de las últimas cuatro columnas en una nueva columna en la misma tabla de datos ignorando las entradas/elementos duplicados de las columnas que se están apilando. ¿Cómo lograr esto en JSL?
Sin saber cómo se ven sus datos y cómo deberían verse al final, mi mejor suposición es usar una combinación de Matriz asociativa() << Obtener claves y Artículos concat()
@jthi Gracias. ¿Pero esto elimina los duplicados?
Mis columnas (para apilar) tienen entradas Char comunes entre ellas pero también entradas únicas. Quiero mantener cada uno en la nueva columna eliminando los duplicados.
Matrices asociativas No se pueden tener claves duplicadas, así que sí las tendrá (también está ordenado, por lo que el orden puede cambiar).
A continuación se muestran algunas formas de hacer esto:
- Operaciones de mesa:
- Apila las columnas en una columna usando Tablas > Apilar
- Utilice Tablas > Resumen con esa columna apilada como rol de grupo
- jsl
- Obtener valores de columna en una lista
- list_of_values = columna (nombre de la tabla, nombre de la columna) << obtener valores
- Puede hacer esto nuevamente en otra columna e insertar esos valores en la lista
- list_of_values = Insertar en (lista_de_valores, columna (nombre de la tabla, otro nombre de columna) << obtener valores)
- repetir según sea necesario
- Utilice una matriz asociada para obtener los valores únicos
- valores_únicos = (matriz asociativa (lista_de_valores)) << obtener claves
- poner esa lista de valores en una nueva columna en una tabla de datos
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 DE ACUERDO. Gracias. ¿Es esta la sintaxis correcta?
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
Ambos funcionan bien, pero agregan una fila vacía si el número de filas no es el mismo para cada columna como en el caso de mi conjunto de datos real.
si insertas el codigo
remove from(unique_values, loc(unique_values,"")[1])
después de la línea donde se crea la lista de valores_únicos, eso eliminará el valor de la lista que es la cadena vacía.
remove from(unique_values, 1)
También debería funcionar, ya que las claves se ordenan alfabéticamente según se solicitan.