2016-10-19 5 views
2

У меня есть данные, что выглядит следующим образом:Удалить все после последнего пространства с 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.*$", "")) 

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

+4

Вы действительно можете взять регулярное выражение из непринятого ответа по адресу http://stackoverflow.com/questions/20497895/regular-expression-in-r-to-remove-the-part-of-a-string- after-the-last-space –

ответ

4

Мы можем использовать 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+) до конца строки и заменить его пустым "". В коде OP он был неспецифичным (.*).

+0

Не могли бы вы объяснить, что происходит с '+ [^] +' в регулярном выражении? Я понимаю, \\ s и $ .... просто не средняя часть. – emehex

+0

@emehex Всякий раз, когда мы используем '^' внутри квадратных скобок, а также имеем другой символ (здесь это пробел), это означает, что любой символ, кроме пробела (здесь) – akrun

+0

Gotcha. Мне не нравится переработанный '^' ... Я просто знал это как противоположность '$'. – emehex