you can try this:
df %>%
gather(key, value, -company) %>%
separate(key, c("key", "year")) %>%
spread(key, value)
output is:
# A tibble: 10 x 4
company year emp rev
<chr> <chr> <dbl> <dbl>
1 a 1 6 1
2 a 2 7 2
3 a 3 8 3
4 a 4 9 4
5 a 5 10 5
6 b 1 5 10
7 b 2 4 9
8 b 3 3 8
9 b 4 2 7
10 b 5 1 6
I used this data:
structure(list(company = c("a", "b"), `rev 1` = c(1, 10), `rev 2` = c(2,
9), `rev 3` = c(3, 8), `rev 4` = c(4, 7), `rev 5` = c(5, 6),
`emp 1` = c(6, 5), `emp 2` = c(7, 4), `emp 3` = c(8, 3),
`emp 4` = c(9, 2), `emp 5` = c(10, 1)), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -2L), spec = structure(list(
cols = list(company = structure(list(), class = c("collector_character",
"collector")), `rev 1` = structure(list(), class = c("collector_double",
"collector")), `rev 2` = structure(list(), class = c("collector_double",
"collector")), `rev 3` = structure(list(), class = c("collector_double",
"collector")), `rev 4` = structure(list(), class = c("collector_double",
"collector")), `rev 5` = structure(list(), class = c("collector_double",
"collector")), `emp 1` = structure(list(), class = c("collector_double",
"collector")), `emp 2` = structure(list(), class = c("collector_double",
"collector")), `emp 3` = structure(list(), class = c("collector_double",
"collector")), `emp 4` = structure(list(), class = c("collector_double",
"collector")), `emp 5` = structure(list(), class = c("collector_double",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1), class = "col_spec"))