Одна идея состоит в том, чтобы заменить первый _
другим разделителем и разделить его на новый разделитель.Это работает, потому что использование sub
заменит только первый найденный разделитель (тогда как gsub
заменяет все), т.е.
strsplit(sub('_', ',', x$a), ',', fixed = TRUE)
#[[1]]
#[1] "A" "B_D"
#[[2]]
#[1] "B" "C"
Чтобы создать два новых столбца в исходном фрейме данных,
within(x, new <- data.frame(do.call(rbind, strsplit(sub('_', ',', x$a), ',', fixed = TRUE))))
# a new.X1 new.X2
#1 A_B_D A B_D
#2 B_C B C