Вы можете использовать accumulate
library(tidyverse)
df %>%
mutate_all(~ as.integer(as.factor(.))) %>%
accumulate(~ .y + max(.x)) %>%
bind_cols %>%
rename_all(~ paste0('Group', seq_along(.)))
# # A tibble: 6 x 4
# Group1 Group2 Group3 Group4
# <int> <int> <int> <int>
# 1 1 7 9 12
# 2 4 5 8 11
# 3 3 6 9 11
# 4 2 6 9 12
# 5 1 5 8 12
# 6 4 7 10 12
Второй столбец отличается от того, который вы показываете, но на основании приведенного ниже вывода он выглядит так, как будто он работает, как ожидалось
df %>%
mutate_all(~ as.integer(as.factor(.)))
# A M Z X
# 1 1 3 2 2
# 2 4 1 1 1
# 3 3 2 2 1
# 4 2 2 2 2
# 5 1 1 1 2
# 6 4 3 3 2
Или, заимствуя идею dum cumsum / sapply (следует принять ответ db, если вы считаете, что этот метод лучше)
df %>%
mutate_all(~ as.integer(as.factor(.))) %>%
map2_dfc(c(0, cumsum(sapply(., max))[-ncol(.)]), `+`)
# # A tibble: 6 x 4
# A M Z X
# <dbl> <dbl> <dbl> <dbl>
# 1 1 7 9 12
# 2 4 5 8 11
# 3 3 6 9 11
# 4 2 6 9 12
# 5 1 5 8 12
# 6 4 7 10 12