Tengo un conjunto de datos verticales con un número impar de datos de años (peso corporal, por ejemplo) para cada caso. Algunos tienen años 1,2,3,4,6 y algunos tienen 3,4,5. Quiero que cada caso tenga 6 filas con la columna del año que contiene 1,2,3,4,5,6 aunque algunos de esos años no tendrán un peso corporal. ¿Cómo puedo asignar a cada caso 6 filas que reconozcan el año faltante apropiado?
Suponiendo que tiene una gran cantidad de datos, se puede usar un script simple para agregar los años que faltan.A continuación, se muestra un ejemplo que crea una tabla original con algunos años faltantes y, a partir de ahí, realiza un par de pasos que terminan agregando los años faltantes.
names default to here(1);
dt = New Table( "Base",
Add Rows( 10 ),
New Column( "Case",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [1, 1, 1, 1, 1, 2, 2, 2, 2, 2] ),
Set Display Width( 43 )
),
New Column( "Year",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [1, 2, 3, 5, 6, 1, 2, 4, 5, 6] )
),
New Column( "OtherStuff", formula(randomuniform()))
);
// Summarize original data table to get a data table of the cases
dtCase = dt << Summary(
Group( :Case ),
Freq( "None" ),
Weight( "None" ),
output table name( "Cases" )
);
dtCase << delete columns(:N Rows);
// Create a new table with just the years
dtYears = new table("years", new column("Year", values([1,2,3,4,5,6])));
// Perform a cartesian join to create a table with all combinations of cases and years
dtCY = Data Table( "Cases" ) << Join(
With( Data Table( "years" ) ),
Cartesian Join,
Output Table( "Case and Years" )
);
// Use a join on the original table to add in the misssing years
dt << Join(
With( dtCY ),
Merge Same Name Columns,
Match Flag( 0 ),
By Matching Columns( :Case = :Case, :Year = :Year ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 1 ),
Preserve main table order( 1 ),
Output Table( "Final" )
);
¡Esto funciona! Tuve que asignar a mi tabla original para obtener los casos, pero el método general funciona bien. ¡Muchas gracias!