first I will reshare your starting data more concisely, also I use tidyverse so load that library
library(tidyverse)
df <- tibble(
A_3 = c("a", "b", "c"),
A_2 = c("d", "e", NA),
A_1 = c("f", NA, NA),
B_1 = c("f", "e", "c"),
B_2 = c("d", "b", NA),
B_3 = c("a", NA, NA)
)
my attempt to solve
(
long_fix <- pivot_longer(df %>% mutate(rn = row_number()),
-rn,
names_sep = "_",
names_to = c("class", "num")
) %>%
mutate(
num = parse_integer(num)
) %>%
arrange(rn, class, num) %>%
group_by(rn, class) %>%
mutate(new_num = max(num) + 1 - num) %>%
ungroup)
df2 <- pivot_wider(long_fix %>% select(-num),
id_cols = rn,
values_from = value,
names_from = c(class,new_num),
names_sep="_") %>% select(-rn)
(ndf2 <- sort(names(df2)))
(df_result <- df2 %>% select(all_of(ndf2)))