やあみんな -
以下の目的の列を返す列式を探しています。この投稿では簡単にするために各グループに 3 行ありますが、現在所有しているデータセットにはさまざまな行数のグループがあります。
助けていただければ幸いです。
| グループ | 時間 | スコア | 初回失敗 (目的の列) |
| あ | 1 | 合格 | 8 |
| あ | 3 | 合格 | 8 |
| あ | 8 | 失敗 | 8 |
| B | 1 | 合格 | 合格 |
| B | 2 | 合格 | 合格 |
| B | 6 | 合格 | 合格 |
| C | 1 | 合格 | 3 |
| C | 3 | 失敗 | 3 |
| C | 7 | 失敗 | 3 |
@user8421 、
これは、データ テーブルの数式を使用する単なる楽しい代替手段です。 これは、グループ サイズが等しくない場合や、テーブルがソートされていない場合に機能します。
このロジックは、各グループ内の失敗の最小行番号を見つけることです。 Col Minimum(... , By)が鍵です。 By オプションを使用した列統計関数は非常に便利ですが、見落とされがちな関数です。

列「最初に失敗した行」の式

「初回失敗時間」列の式。 構文が奇妙に見える場合は、右側の式が Time であることに注意して、添字から行関数を選択し、列 4「Row First Failed」をドラッグします。

以下は、サンプル データ テーブルで機能する数式です。それ以上はテストされていないため、いくつかの調整が必要になる場合があります
Names Default To Here( 1 );
dt = New Table( "Example",
Add Rows( 9 ),
New Column( "Group", Character, "Nominal", Set Values( {"A", "A", "A", "B", "B", "B", "C", "C", "C"} ) ),
New Column( "Time", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 3, 8, 1, 2, 6, 1, 3, 7] ) ),
New Column( "Score",
Character,
"Nominal",
Set Values( {"Pass", "Fail", "Pass", "Pass", "Pass", "Pass", "Pass", "Fail", "Fail"} )
)
);
dt << New Column( "First Time Failed",
character,
formula(
If( Row() == 1,
dt = Current Data Table();
check = :Score;
If( :Group == :Group[2],
Failed = Char( Col Max( :Time, :Group ), Failed = :Score )
);
,
If( :Group == Lag( :Group ),
If( :Score == "Fail",
check = "Fail"
);
Failed = Char( Col Max( :Time, :Group ) );
,
If( check == "Pass",
lagGroup = Lag( :Group );
:First Time Failed[dt << get rows where( :Group == lagGroup )] = "Pass";
Failed = Char( Col Max( :Time, :Group ) );
);
check = :Score;
)
);
failed;
)
);