# Create multi level headers

This vignette introduces how to create multi level headers.

    library(ftExtra)

# Prepare flextable

    ft <- iris[1:2, ] %>% flextable()
    ft

Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species
--- | --- | --- | --- | ---
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa

# Split headers

The `split_header()` function generates multi-level headers by separating original headers (row names) by delimiters.

    ft %>% split_header()

Sepal | Sepal | Petal | Petal | Species
--- | --- | --- | --- | ---
Length | Width | Length | Width |
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa

The `sep` argument defines delimiters by regular expression. The default delimiters are `.` and `_`. Let’s see what happens when `seop = "e"`

    ft %>% split_header(sep = "e")

S | S | P | P | Sp
--- | --- | --- | --- | ---
pal.L | pal.Width | tal.L | tal.Width | ci
ngth |  | ngth |  | s
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa

# Span headers

The `span_header()` function also generates multi-level headers. Unlike the `split_header()` function, the `span_header()` function merges adjacent headers if they have same values.

    ft %>% span_header()

Sepal | Petal | Species
--- | --- | ---
Length | Width | Length | Width
5.1 | 3.5 | 1.4 | 0.2 | setosa
4.9 | 3.0 | 1.4 | 0.2 | setosa