Вы можете попробовать:
library(dplyr)
df %>%
group_by(ID) %>%
filter(n_distinct(Active) > 1) %>%
mutate(time_diff = lead(Timestamp) - Timestamp) %>%
summarise(
Percentage = scales::percent(sum(time_diff[Active == 0], na.rm = T) / sum(time_diff, na.rm = T))
)
Вывод:
# A tibble: 1 x 2
ID Percentage
<int> <chr>
1 80 67.8%
Здесь я предположил на основе вашего вывода, что вы хотели бы отфильтровать те случаи, когда это либо100% или 0%.
В противном случае вы можете сделать:
df %>%
group_by(ID) %>%
mutate(time_diff = lead(Timestamp) - Timestamp) %>%
mutate(
Percentage = sum(time_diff[Active == 0], na.rm = T) / sum(time_diff, na.rm = T),
Percentage = scales::percent(coalesce(Percentage, +(Active == 0) * 1))
) %>%
distinct(ID, Percentage)
Выход:
# A tibble: 6 x 2
# Groups: ID [6]
ID Percentage
<int> <chr>
1 64 0%
2 74 0%
3 76 0%
4 80 67.8%
5 22 0%
6 51 0%