0

I have the below simple example

library(tidyverse)
dd = data.frame(xx=c("sdsds1234","ddd252","rrr34566"))
dd %>% separate(col = xx,remove =F,into = c("Name","MedID"))
         xx      Name MedID
1 sdsds1234 sdsds1234  <NA>
2    ddd252    ddd252  <NA>
3  rrr34566  rrr34566  <NA>

However, what I want is to separate letters and digital numbers like

         xx      Name MedID
1 sdsds1234 sdsds  1234
2    ddd252    ddd  252
3  rrr34566  rrr  34566
Z. Zhang
  • 637
  • 4
  • 16

2 Answers2

1

Here's one way using extract -

library(tidyr)

extract(dd, xx, c("Name", "MedID"), "([a-z]+)(\\d+)", remove = FALSE)

#         xx  Name MedID
#1 sdsds1234 sdsds  1234
#2    ddd252   ddd   252
#3  rrr34566   rrr 34566

And since both separate and extract are superseded we can use the new separate_wider_regex function.

dd %>% 
    separate_wider_regex(xx, 
         c(Name = "[a-z]+", MedID = "\\d+"), cols_remove = FALSE)
Ronak Shah
  • 377,200
  • 20
  • 156
  • 213
0

Using base R

 cbind(dd, read.csv(text = sub("(\\D+)(\\d+)", "\\1,\\2", dd$xx), 
  header = FALSE, col.names = c("Name", "MedID")))

-output

        xx  Name MedID
1 sdsds1234 sdsds  1234
2    ddd252   ddd   252
3  rrr34566   rrr 34566
akrun
  • 874,273
  • 37
  • 540
  • 662