Other options include tstrsplit from the devel data.table version
library(data.table)#v1.9.5+ setDT(df)[,tstrsplit(V1,'(?<=\\d)(?=\\D)', perl=TRUE, type.convert=TRUE)] # V1 V2 #1: 131341 adad #2: 45365 adadar #3: 425 cavsbsb #4: 46567567 daadvsv
If there are elements, the "non-numeric" part appears first, and the "numeric" part appears last, then we can use a more generalized option as a regular expression template,
setDT(df)[,tstrsplit(V1, "(?<=\\d)(?=\\D)|(?<=\\D)(?=\\d)", perl = TRUE)]
Or using extract from tidyr
library(tidyr) extract(df, V1, into=c('V1', 'V2'), '(\\d+)(\\D+)', convert=TRUE) # V1 V2 #1 131341 adad #2 45365 adadar #3 425 cavsbsb #4 46567567 daadvsv
If you need a source column too,
extract(df, V1, into=c('V2', 'V3'), '(\\d+)(\\D+)', convert=TRUE, remove=FALSE) # V1 V2 V3 #1 131341adad 131341 adad #2 45365adadar 45365 adadar #3 425cavsbsb 425 cavsbsb #4 46567567daadvsv 46567567 daadvsv
For data.table we can use := to create new columns so that existing columns remain in the output, i.e.
setDT(df)[,paste0('V',2:3):=tstrsplit(V1,'(?<=\\d)(?=\\D)', perl=TRUE, type.convert=TRUE)] # V1 V2 V3 #1: 131341adad 131341 adad #2: 45365adadar 45365 adadar #3: 425cavsbsb 425 cavsbsb #4: 46567567daadvsv 46567567 daadvsv
NOTE. Both solutions have the ability to convert a split column class ( type.convert/convert ).
data
df <- data.frame(V1 = c("131341adad", "45365adadar", "425cavsbsb", "46567567daadvsv"))