Question: My data frame looks like:

```
b <- data.frame(height = c(190,165,174,176), name = c('John Smith 34','Mr.Turner 54', 'Antonio P. 23', 'John Brown 31'))

#   height          name
# 1    190 John Smith 34
# 2    165  Mr.Turner 54
# 3    174 Antonio P. 23
# 4    176 John Brown 31

```

As we can see name and age are the same value. So I want to split it by last two characters in string:

```
  height       name age
1    190 John Smith  34
2    165  Mr.Turner  54
3    174 Antonio P.  23
4    176 John Brown  31

```

How I can do that?

Answer: 
many options here using regular expression.I would use `substr` because you want know exactly the number of characters to extract. 

Within `data.table` (for syntax-sugar):

```
library(data.table)
setDT(b)[,c("name","age"):=list(
  substr(name,1,nchar(name)-3),
  substr(name,nchar(name)-2,nchar(name)))]

   height       name age
1:    190 John Smith  34
2:    165  Mr.Turner  54
3:    174 Antonio P.  23
4:    176 John Brown  31

```

Note that *name* should be a `character` :

```
  b <- data.frame(
  height = c(190,165,174,176), 
  name = c('John Smith 34','Mr.Turner 54', 'Antonio P. 23', 'John Brown 31'),
  stringsAsFactors = FALSE)

```
Personally, I would find the following regular expression most useful.

```
library (stringr)
b $age <- str_extract (b$name, "\\d{1,3}$")
b $name <- str_replace (b $name,  "\\d{1,3}$", "")

```

This looks for a sequence of digits 1-3 characters long at the end of the string. There is probably a way to incorporate it into the `separate` syntax, but I'm writing from my phone and cannot explore.

The advantage to this regular expression is it will handle single, double, and triple digit ages without having to depend on the space being present, or having to count back from the end of the string.