Я придумал кое-что, что не очень красиво - отчасти потому, что R, возможно, не лучший инструмент для этого - но это помогает.
Здесь strsplit используется для разбиения блоков, разделенных '&'.
gsub снимает скобки и 'ID'.
as.numeric превращает его в числа (альтернатива: as.integer).
сортировка не требует дополнительных объяснений
В результате получается список векторов со всеми отсортированными идентификаторами. Названия элементов списка являются исходными элементами
df <- c("(ID 3) Cola & (ID 1) Sprite",
"(ID 1) Sprite & (ID 3) Cola",
"(ID 2) water & (ID 3) Cola & (ID 4) Other",
"(ID 3) Cola & (ID 1) Sprite & (ID 2) water")
df2 <- sapply(df,function(x) strsplit(x,split='& *'))
result <- lapply(df2, function(x) {
sort(as.numeric(gsub(').*','',gsub('\\(ID ','',x))))
})
## Show result:
result
$`(ID 3) Cola & (ID 1) Sprite`
[1] 1 3
$`(ID 1) Sprite & (ID 3) Cola`
[1] 1 3
$`(ID 2) water & (ID 3) Cola & (ID 4) Other`
[1] 2 3 4
$`(ID 3) Cola & (ID 1) Sprite & (ID 2) water`
[1] 1 2 3