こんにちは。データのクリーンアップについてサポートが必要です。テーブル内のデータには、複数の ID、日付、カテゴリが含まれています。カテゴリ 1 と 2、または 1 と 2 と 3、または 1 と 3 の ID に関心があり、各カテゴリの最大日付のエントリのみを保持したいと考えています。このソリューションに最適なスクリプトを提供していただけますか? ありがとうございます!
| ID | カテゴリー | 日付 | コストA | コストB | コストC | コストD |
| 1 | 1 | 16/1/21 | 5000 | 0 | 3000 | 500 |
| 1 | 1 | 16/1/21 | 1000 | 5000 | 10000 | 0 |
| 1 | 1 | 16/1/21 | 20000 | 0 | 10 | 50 |
| 1 | 2 | 16/1/22 | 3000 | 0 | 0 | 50000 |
| 1 | 3 | 2016 年 2 月 1 日 | 1 | 10 | 900 | 0 |
| 2 | 1 | 2013 年 4 月 2 日 | 0 | 100 | 10000 | 5000 |
| 2 | 2 | 2013 年 4 月 3 日 | 0 | 0 | 0 | 642.49 |
| 2 | 1 | 2013 年 4 月 2 日 | 1 | 10 | 900 | 0 |
| 3 | 2 | 2015年3月6日 | 50 | 0 | 0 | 259.58 |
ここに動作するはずの小さなスクリプトを示します。定義を満たす行が検索されます。これらの行は新しいテーブルにサブセット化されます。
Names Default To Here( 1 );
dt = Current Data Table();
For Each Row(
If( :date == Col Maximum( :date, :ID ),
currID = :ID;
//currID="1"
cats = Associative Array( dt:category[dt << get rows where( :ID == currID )] ) << get keys;
If( cats[1] == "1" & Length( cats ) > 1,
dt << select rows( Row() )
);
)
);
dtNew = dt << subset( selected columns(0), selected rows(1),
output table("Final")
);
// The above code will allow multiple rows within a given ID, when there are
// multiple rows with the same maximum date. Run the below code to
// get rid of the multiple entries, if that is what is desired
dtNew << select duplicate rows(Match(:ID));
dtNew << delete rows;


上記のスクリプトの最後の 2 行を実行すると、重複する ID 行が削除されます。

ジム、
ご協力ありがとうございます。混乱をおかけして申し訳ございません。最終テーブルには、カテゴリ 1 と 2 および/または 3 を持つ各 ID が必要です。同じカテゴリの ID が重複している場合は、日付が最大の行が必要です。テーブルはここに提供される必要があります。ご協力をよろしくお願いします。
| ID | カテゴリー | 日付 | コストA | コストB | コストC | コストD |
| 1 | 1 | 16/1/21 | 20000 | 0 | 10 | 50 |
| 1 | 2 | 16/1/22 | 3000 | 0 | 0 | 50000 |
| 2 | 1 | 2013 年 4 月 2 日 | 0 | 100 | 10000 | 5000 |
| 2 | 2 | 2013 年 4 月 3 日 | 0 | 0 | 0 | 642.49 |
| 3 | 1 | 2015年3月6日 | 3000 | 0 | 0 | 817 |
| 3 | 2 | 2015年3月6日 | 50 | 0 | 0 | 259.58 |
| 4 | 1 | 2015年3月6日 | 10000 | 0 | 0 | 710.16 |
| 4 | 2 | 2015年3月6日 | 5000 | 0 | 0 | 1087 |
| 4 | 3 | 2015/3/16 | 0 | 0 | 0 | 326.7 |
上記の例では、カテゴリは文字列でした。あなたの例では数値です。また、少なくともカテゴリ1と2、1と3、または1と2と3があることを確認するためにロジックを変更しました。
Names Default To Here( 1 );
dt = Current Data Table();
For Each Row(
If( :date == Col Maximum( :date, :ID ),
currID = :ID;
cats = Associative Array( dt:category[dt << get rows where( :ID == currID )] ) << get keys;
show(cats);
If( Length( cats ) > 1,
If( cats[1] == 1 & (cats[2] == 2 | cats[2] == 3),
dt << select rows( Row() )
)
);
)
);
dtNew = dt << subset( selected columns( 0 ), selected rows( 1 ), output table( "Final" ) );
Col関数を使用してこれにアプローチする方法の1つは次のとおりです。
Names Default To Here(1);
dt = New Table("Untitled 3",
Add Rows(11),
Compress File When Saved(1),
New Column("ID", Numeric, "Continuous", Format("Best", 12), Set Values([1, 1, 1, 2, 3, 3, 4, 4, 4, 4, 4])),
New Column("Category", Character, "Nominal", Set Values({"A", "A", "B", "A", "A", "C", "A", "A", "B", "B", "C"})),
New Column("Date", Numeric, "Continuous", Format("Best", 12), Set Values([1, 1, 2, 1, 1, 2, 1, 2, 1, 2, 1]))
);
dt << New Column("KEEP", Numeric, Nominal, Formula(
Col Sum(Row() == Col Min(Row(), :category, :id), :id) > 1 & :date == Col Max(:date, :category, :id)
));
数式を << Select Where / << Get Rows Where に変更するか、サブセットを使用して保持する行を取得します。

編集:
元のバージョンでは、カテゴリ 1 が欠落している可能性があることを考慮していませんでした (カテゴリが数値列であると想定しています)
New Column("KEEP", Numeric, Nominal, Formula(
Col Sum(Row() == Col Min(Row(), :category, :id), :id) > 1
& :date == Col Max(:date, :category, :id)
& Col Sum(If(:category == 1, 1, .), :id)
));