Я пытаюсь найти решение, используя синтаксис tidyverse
, чтобы решить следующую проблему.
Учитывая таблицу типов и размеров видеокадров, я хотел бы сгруппировать их в «Группы изображений». GOP начинается всякий раз, когда появляется I-кадр. Итак, учитывая эти данные:
d.test <- tribble(
~frame_type, ~frame_size,
"I", 960,
"B", 23,
"P", 48,
"B", 58,
"I", 501,
"B", 23,
"P", 48,
"B", 58
)
Я бы хотел, чтобы первые четыре кадра относились к группе 1, следующие четыре — к группе 2 и т. д. Группы могут быть разной длины, поэтому просто использовать трюк с модулем четыре недостаточно.
Я сначала попробовал это:
d.test %>%
mutate(group = group_indices(., frame_type))
… но он повторяет индекс группы по всему кадру данных.
Я также попробовал функцию my_rleid
предложено здесь:
my_rleid <- function(x) {
1L + cumsum(dplyr::coalesce(x != dplyr::lag(x), FALSE))
}
… но сюда входят все типы фреймов, поэтому возвращаются идентификаторы группы 1, 2, 3, 4 и т. д.
Я мог бы заставить его работать, вычислив совокупную сумму сравнения типа кадра с I
:
d.test %>%
mutate(group = cumsum(frame_type == "I"))
Это возвращает:
frame_type frame_size group
<chr> <dbl> <int>
1 I 960 1
2 B 23 1
3 P 48 1
4 B 58 1
5 I 501 2
6 B 23 2
7 P 48 2
8 B 58 2
Спасибо, отличное предложение!
не надо
if_else
. Вы можете просто сделатьcumsum(frame_type == 'I')
. Точно так же это работает и на логическом.