Мы можем split
на основе подстроки names
из 'input' и преобразовать в data.frame
data.frame(split(unname(input), sub("_\\d+$", "", names(input))))
# a b
#1 2 1
#2 3 0
Или используя unstack
nm1 <- sub('_\\d+$', '', names(input))
unstack(input ~ nm1, data.frame(input, nm1))
Или другой вариант - конструкция matrix
, если 'a', 'b' имеют одинаковую длину
matrix(input, ncol = 2, dimnames = list(NULL,
unique(substring(names(input), 1, 1))))