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)

```
We can create a delimiter (`,`) instead of the space before the age using `sub`, read it with `read.table` and `cbind` with the first column using `base R`

```
cbind(b[1],read.table(text=sub("\\s+(\\d+)$", ", \\1", b$name), 
                 col.names = c("name", "age"), header=FALSE, sep=","))
#  height       name age
#1    190 John Smith  34
#2    165  Mr.Turner  54
#3    174 Antonio P.  23
#4    176 John Brown  31

```

---

Or using `extract` from `tidyr`

```
library(tidyr)
extract(b, name, into = c("name", "age"), "(.*)\\s+(\\S+)$")
#  height       name age
#1    190 John Smith  34
#2    165  Mr.Turner  54
#3    174 Antonio P.  23
#4    176 John Brown  31

```