Aquí está la muestra. La columna Delta es lo que estoy tratando de lograr. Los números de parte son categoría.
| Parte# | Datos | Delta |
| 1 | 4 | 4 - 4 |
| 2 | 5 | 5 - 5 |
| 3 | 6 | 6 - 6 |
| 1 | 7 | 4 - 7 |
| 2 | 8 | 5 - 8 |
| 3 | 9 | 6 - 9 |
| 1 | 10 | 7 - 10 |
| 2 | 11 | 8 - 11 |
| 3 | 12 | 9 - 12 |
¿Necesito definir la columna "Patrón Delta"?
Así es como lo haría
Names Default To Here( 1 );
// Create the sample data table
dt = New Table( "Example",
Add Rows( 9 ),
New Column( "Part#", Character, "Nominal", Set Values( {"1", "2", "3", "1", "2", "3", "1", "2", "3"} ) ),
New Column( "Data",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [0, 0, 0, 9, 23, 45, 1, 34, 56] )
),
New Column( "Delta Pattern",
Character,
"Nominal",
Set Values( {"0 - 0", "0 - 0", "0 - 0", "0 - 9", "0 - 23", "0 - 45", "9 - 1", "23 - 34", "45 - 56"} )
)
);
// Add a new column to provide a path back to the original order
dt << New Column( "RowNum", formula( Row() ) );
// Delete the formula, so the values become static rather than calculated
dt:RowNum << delete formula;
// Sort the data by Part# and Row
dt << sort( by( Part#, :RowNum ), replace table( 1 ) );
// Create the new column with the delta values, which is pretty simple with all of
// the data sorted by Part#
dt << New Column( "Delta", formula( If( Lag( :Part# ) != Part#, 0, Lag( :Data ) - :Data ) ) );
// Delete formula so the values become static
dt:Delta << delete formula;
// Sort back into the original order
dt << sort( by( :RowNum ), replace table( 1 ) );
// Delete the Rownum column since it is no longer needed
dt << delete columns( "RowNum" );
También hay otras formas de hacerlo, pero serían más lentas de calcular.
Hola Jim,
gracias por la pronta respuesta.
esto funciona en caso de que el número de fila coincida con los valores de la columna Datos para la resta. ¿Qué sucede si hay valores aleatorios en la columna de datos y desea considerar los valores sin procesar de las columnas de datos para la resta?
Como una fórmula de columna
If( Row() <= 3, :Data, :Data - Row() );
en un guión
For Each Row(
If( Row() <= 3, :Delta = :Data, :Delta = :Data - Row() );
);