こちらがサンプルです。 デルタ列は私が達成しようとしているものです。 部品番号はカテゴリです。
| 部# | データ | デルタ |
| 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 |
私ならこうします
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" );
他にも方法はありますが、計算が遅くなります。
こんにちは、ジムさん
素早い対応ありがとうございます。
これは、行番号が減算のデータ列の値と一致する場合に機能します。データ列にランダムな値があり、減算のためにデータ列の生の値を考慮したい場合はどうすればよいでしょうか?
列の式として
If( Row() <= 3, :Data, :Data - Row() );
スクリプト内で
For Each Row(
If( Row() <= 3, :Delta = :Data, :Delta = :Data - Row() );
);