Tidyr values ​​of individual columns per character and numeric values ​​using regular expression

I would like to separate column values ​​with tidyr::separateand regex expressions, but I don't know regex expressions

df <- data.frame(A=c("enc0","enc10","enc25","enc100","harab0","harab25","harab100","requi0","requi25","requi100"), stringsAsFactors=F) 

Here is what I tried

library(tidyr)
df %>%
   separate(A, c("name","value"), sep="[a-z]+")

Bad conclusion

   name value
1           0
2          10
3          25
4         100
5           0
# etc

How do I save a column name?

+5
source share
4 answers

You can use regex (?<=[a-z])(?=[0-9])with tidyr::separate:

> tidyr::separate(df, A, into = c("name", "value"), "(?<=[a-z])(?=[0-9])")
    name value
1    enc     0
2    enc    10
3    enc    25
4    enc   100
5  harab     0
6  harab    25
7  harab   100
8  requi     0
9  requi    25
10 requi   100

(?<=[a-z])(?=[0-9]) ASCII ((?<=[a-z])) ((?=[0-9])). (?<=...) - , , (?=...) - , . , .

extract:

extract(df, A, into = c("name", "value"), "^([a-z]+)(\\d+)$")

:

    name value
1    enc     0
2    enc    10
3    enc    25
4    enc   100
5  harab     0
6  harab    25
7  harab   100
8  requi     0
9  requi    25
10 requi   100

^([a-z]+)(\\d+)$ :

  • ^ -
  • ([a-z]+) - 1 ( name): ASCII
  • (\\d+) - 2 ( value):
  • $ - .
+8

. separate, , .. ( , @WiktorStribiżew),

df %>% 
  mutate(A = gsub('^([a-z]+)(\\d+)$', '\\1_\\2', A)) %>% 
  separate(A, into = c('name', 'value'), sep = '_')
+1

R , , :

> re <- "[a-zA-Z][0-9]"

substr() .

> with(df,
      data.frame(name=substr(A, 1L, regexpr(re, A)), 
                 value=substr(A, regexpr(re, A) + 1L, 1000L))
      )
    name value
1    enc     0
2    enc    10
3    enc    25
4    enc   100
5  harab     0
6  harab    25
7  harab   100
8  requi     0
9  requi    25
10 requi   100

" " [a-zA-Z], " " [0-9]. , reshape, sep "".

0

unglue

library(unglue)
unglue_unnest(df, A, "{name=\\D+}{value}")
#>     name value
#> 1    enc     0
#> 2    enc    10
#> 3    enc    25
#> 4    enc   100
#> 5  harab     0
#> 6  harab    25
#> 7  harab   100
#> 8  requi     0
#> 9  requi    25
#> 10 requi   100

Created on 2019-10-08 by the reprex package (v0.3.0)

0
source

Source: https://habr.com/ru/post/1683346/


All Articles