Hola a todos -
Estoy buscando una fórmula de columna que devuelva la siguiente columna deseada a continuación.Para simplificar en esta publicación, cada grupo tiene 3 filas, pero el conjunto de datos que tengo actualmente tiene grupos con diferentes números de filas.
¡Cualquier ayuda apreciada!
| Grupo | Tiempo | Puntaje | Error por primera vez (columna deseada) |
| A | 1 | Aprobar | 8 |
| A | 3 | Aprobar | 8 |
| A | 8 | Fallar | 8 |
| B | 1 | Aprobar | Aprobar |
| B | 2 | Aprobar | Aprobar |
| B | 6 | Aprobar | Aprobar |
| C | 1 | Aprobar | 3 |
| C | 3 | Fallar | 3 |
| C | 7 | Fallar | 3 |
@usuario8421 ,
Esta es simplemente una alternativa divertida que utiliza fórmulas de tablas de datos. Funcionará para tamaños de grupo desiguales y si la tabla no está ordenada.
La lógica es encontrar el número mínimo de filas para fallas en cada grupo. Col mínima(... , por) es la llave. Las funciones de estadísticas de columna que utilizan la opción Por son funciones muy útiles, pero a menudo se pasan por alto.

Fórmula para la columna "Error en la primera fila"

Fórmula para la columna "Tiempo que falló por primera vez". Tenga en cuenta que si la sintaxis parece extraña, la fórmula de la derecha es Tiempo, luego seleccione Subíndice desde el Fila funciones y arrastre la columna 4, "Error en la primera fila"

Aquí hay una fórmula que funciona con su tabla de datos de ejemplo.No se ha probado más allá de eso, por lo que es posible que tengas que hacer algunos ajustes.
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;
)
);