Костя, привет.
data.tree
— хороший вариант. Все-таки, дерево, как никак.
Не знаю, сколько у тебя там строк и чем не устраивает.
Но могу поделиться своим вариантом. Подумал, пока в метро ехал.
Ключевой момент —
вспоминаем сборку оглавления в LaTeX.
1. Готовим исходные данные.
Очевидно, что тут WDS, поэтому для ясности я добавил еще 4-ый элемент, дабы не было желания группировать по колонкам.
plain_df <- tribble(
~element, ~sublvl, ~value,
"el1", "obj1", "val1",
"el1", "obj2", "val1",
"el2", "obj1", "val1",
"el2", "obj1", "val2",
"el3", "obj1", "val1",
"el1", "obj1", "val3"
)
2. Непосредственно генерация (~ 7 значимых строк)
# формируем счетчики заголовков (TOC_counter)
toc_dt <- plain_df %>%
rename(val1 = element, val2 = sublvl, val3 = value) %>%
as.data.table() %>%
.[, idx := .I] %>%
.[, cnt1 := rleid(val1)] %>%
.[, cnt2 := rleid(val2), by = cnt1] %>%
.[, cnt3 := rowidv(val3), by = .(cnt1, cnt2)] %>%
# формируем все возможные комбинации оглавлений
.[, {list(toc_num = c(cnt1,
paste(cnt1, cnt2, sep = "."),
paste(cnt1, cnt2, cnt3, sep = ".")),
toc_name = c(val1,
paste(val1, val2, sep = "."),
paste(val1, val2, val3, sep = ".")))}, by = idx] %>%
# оставляем только первое вхождение для каждого элемента оглавления
.[, head(.SD, 1), by = toc_num]