Вы можете использовать gtools :: mixedorder для сортировки значений символов по их числовым компонентам
library(gtools)
df[order(grepl('item', names(df)), order(mixedorder(names(df))))]
# or
df[mixedorder(paste0(grepl('item', names(df)), names(df)))]
# name item1 item2 item3 item12
# 1 NA NA NA NA NA
или в базе R (тот же вывод)
df[order(grepl('item', names(df)), as.numeric(gsub('[^1-9]', '', names(df))))]
Используемые данные:
df <- matrix(NA, 1, 5)
colnames(df) <- c('name', paste0('item', c(2, 3, 1, 12)))
df <- as.data.frame(df)