Удалите все после последнего пробела с помощью stringr

У меня есть данные, которые выглядят так:

df <- tribble(
    ~name, ~value,
    "Jake Lake MLP", 10, 
    "Bay May CE", 5,
    "Drake Cake Jr. DSF", 9.1,
    "Sam Ram IR QQQZ", 1
)

Я хочу обрезать все имена так, чтобы они были:

"Jake Lake",
"Bay May", 
"Drake Cake Jr.",
"Sam Ram IR"

В основном удаляя все после последнего пробела.

Я старался:

df %>% mutate(name = str_replace(name, "\\s.*$", ""))

Но это не совсем то, что я хочу!


person emehex    schedule 19.10.2016    source источник
comment
На самом деле вы можете взять регулярное выражение из непринятого ответа по адресу stackoverflow.com/questions/20497895/   -  person Wiktor Stribiżew    schedule 20.10.2016


Ответы (1)


Мы можем использовать sub

df %>% 
    mutate(name = sub("\\s+[^ ]+$", "", name))

Или тот же шаблон в str_replace

df %>% 
   mutate(name = str_replace(name, "\\s[^ ]+$", ""))
# A tibble: 4 × 2
#            name value
#           <chr> <dbl>
#1      Jake Lake  10.0
#2        Bay May   5.0
#3 Drake Cake Jr.   9.1
#4     Sam Ram IR   1.0

Шаблон указывает пробел (\\s), за которым следует один или несколько непробельных пробелов (в противном случае может быть \\S+) до конца строки, и замените его пробелом "". В коде ОП это было неспецифично (.*).

person akrun    schedule 19.10.2016
comment
не могли бы вы объяснить, что происходит с +[^ ]+ в регулярном выражении? Я так понимаю \\s и $.... только не средний кусок. - person emehex; 20.10.2016
comment
@emehex Всякий раз, когда мы используем ^ внутри квадратных скобок, а также имеем другой символ (здесь это пробел), это означает соответствие любому символу, кроме пробела (здесь) - person akrun; 20.10.2016
comment
Попался. Мне не нравится переработанный ^ ... Я просто знал его как противоположность $. - person emehex; 20.10.2016
comment
@emehex Если вы используете его отдельно, это означает начало строки. Так что его значение отличается - person akrun; 20.10.2016