Estou tentando filtrar pares (identificados por id
) com base em condições. Tenho o seguinte data frame,
id <- c(1,1,2,2,1,1,3,3,4,4)
PorF <- c("start","fail","start","pass","start","pass","start","pass","start","fail")
timest <- c(as.POSIXct("2021-05-08 08:15:07"),
as.POSIXct("2021-05-08 08:15:45"),
as.POSIXct("2021-05-28 08:17:09"),
as.POSIXct("2021-05-28 08:17:25"),
as.POSIXct("2021-05-28 08:32:07"),
as.POSIXct("2021-05-28 08:32:12"),
as.POSIXct("2021-05-28 08:33:14"),
as.POSIXct("2021-05-28 08:33:45"),
as.POSIXct("2021-05-28 08:34:12"),
as.POSIXct("2021-05-28 08:34:56"))
testdf <- data.frame(id, PorF, timest)
testdf
> testdf
id PorF timest
1 1 start 2021-05-08 08:15:07
2 1 fail 2021-05-08 08:15:45
3 2 start 2021-05-28 08:17:09
4 2 pass 2021-05-28 08:17:25
5 1 start 2021-05-28 08:32:07
6 1 pass 2021-05-28 08:32:12
7 3 start 2021-05-28 08:33:14
8 3 pass 2021-05-28 08:33:45
9 4 start 2021-05-28 08:34:12
10 4 fail 2021-05-28 08:34:56
Quero filtrar aqueles IDs que têm um start e um pass. Todos os pares com start e fail devem ser filtrados.
Minha saída esperada deve ser semelhante a esta,
> filtered_testdf
id PorF timest
2 start 2021-05-28 08:17:09
2 pass 2021-05-28 08:17:25
1 start 2021-05-28 08:32:07
1 pass 2021-05-28 08:32:12
3 start 2021-05-28 08:33:14
3 pass 2021-05-28 08:33:45
O que estou tentando é isso que não está dando o que eu quero,
testdf |>
group_by(id) |>
filter(PorF == "start" & PorF == "pass")
Alguma ideia de como atingir o resultado esperado?
Você pode fazer:
Ou equivalentemente:
Observe que tive que criar uma variável id adicional, pois (veja meu comentário acima) há vários pares de linhas com o mesmo id (ou seja, o id 1 tem dois pares).
Você pode escrever uma pequena função auxiliar que divide os dados em dois com base na primeira (início) ou segunda (resultado) linha de cada "par" (assumindo que seus pares são contíguos) e então encontra as linhas no segundo que passaram (ou falharam). Então, combine-as.
Uma opção R básica, mas segue a mesma filosofia da solução de Deschen