分割不同的固定宽度字符串格式

Ben*_*bbn 5 string split r fixed-width

新手提问!我有一列包含两种不同固定宽度格式的字符串。我们可以通过名称识别格式的类型,并根据格式分割字符串。

df <- data.frame(
var1 =  c('M1B123456789MM1158','M1C123456789zMM1183'),
var2 =  c('code1','code8'))
Run Code Online (Sandbox Code Playgroud)

固定宽度格式为:

formatM1B = c(3,9,2,4)
formatM1C = c(3,9,1,2,4)
Run Code Online (Sandbox Code Playgroud)

所以我希望这个结果:

 |format|var1_2   |var1_3|var1_5|var1_6|code |
1|M1B   |123456789|      |MM    |1158  |code1|
2|M1C   |123456789|z     |MM    |1183  |code8|
Run Code Online (Sandbox Code Playgroud)

我尝试了splitstr_splitstr_split_fixed函数,但我不知道如何将其与某种 IF 函数结合起来以“测试”或“正则表达式”字符串中提到的格式。这个问题肯定被问了很多次,我做了几个小时的研究,但无法找到适合我的数据的东西:/

Rob*_*toT 1

library(tidyverse)

df %>% 
   extract(col= var1,into = c('format','1','2','3','4'), 
          regex = "^(M[1-9][A-Z])([1-9]{9})(z)?(M{2})([1-9]{4})")
Run Code Online (Sandbox Code Playgroud)

正则表达式有 5 组:

  1. (M[1-9][AZ]):搜索 M、int: 1,...,9 和一个大写字母
  2. ([1-9]{9}):搜索 9 个 int 数字:1,...,9
  3. (z)?:查找是否有az或跳过
  4. (M{2}):搜索 2 M
  5. ([1-9]{4}):搜索 4 个 int 数字:1,...,9

输出:

  format         1 2  3    4  var2
1    M1B 123456789   MM 1158 code1
2    M1C 123456789 z MM 1183 code8
Run Code Online (Sandbox Code Playgroud)