Может быть лучше с extract
. Здесь мы можем использовать группы захвата, чтобы захватить персонажей как группу. Лучше начинать с конца ($
) и идти назад, т. Е. Слово (\\w+
) в конце перехвачено, следует ,
или пробел (\\s
) и все другие символы в первой группе захвата((.*?)
)
library(tidyr)
library(dplyr)
tib %>%
extract(x, into = c("description", "fruit"), remove = FALSE, '(.*?),?\\s?(\\w+$)')
Или с использованием регулярного выражения с separate
, указав разделитель в виде ,
, за которым следует пробел или начало (^
) строки, за которой следует символслово (\\w+
) в конце ($
) строки
tib %>%
separate(x, into = c("description", 'fruit'),
remove = FALSE, '(, |^)(?=\\w+$)') %>%
mutate(description = na_if(description, ""))
Кроме того, другой вариант с separate
будет заключаться в добавлении нового разделителя перед последним словом, а затемиспользуйте это как sep
library(stringr)
tib %>%
mutate(x1 = str_replace(x, ',? ?(\\w+)$', ";\\1")) %>%
separate(x1, into = c("description", "fruit"), sep=";") %>%
mutate(description = na_if(description, ""))
# A tibble: 3 x 3
# x description fruit
# <chr> <chr> <chr>
#1 lemon <NA> lemon
#2 yellow, banana yellow banana
#3 red, big, apple red, big apple