Существует более общий подход к регулярным выражениям, который не требует указания ширины ведущей строки:
Либо удалите все, что включает, и после подчеркивания:
> as.numeric(factor(sub("_.+", "" , x)))
[1] 1 1 2 3 3
Или выберите символы, которые предшествуют подчеркиванию (так как в регулярном выражении R части шаблонов, заключенные в скобки, могут указываться в строке замены как "\\", за которым следует цифра):
> as.numeric(factor(sub("(^.+)_.+$", "\\1" , x)))
[1] 1 1 2 3 3