按数据框列中的字符数拆分字符串以在 R 中创建多列?

Split an string by number of characters in a column of a data frame to create multiple columns in R?

r中有data framedf)如下,它有ID个10个字符的字符串。

df:
        ID         Var1 Var2
    1   0334KLM001  aa  xx
    2   1334HDM002  zvv rr
    3   2334WEM003  qetr qwe
    4   3334OKT004  ff  sdf
    5   4334WER005  ee  sdf
    6   5334BBC006  qly ssg
    7   6334QQQ007  kk  htj
    8   7334AAA008  uu  yjy
    9   8334CBU009  ww  wttt
    10  9334MLO010  aa  dg

意向:
使用 r 命令,我想将 ID 分成两个额外的列,仅按 个字符数 。例如,我想将两列 (Spl_1 & Spl_2) 添加到 df 其中 Spl_1 具有 前四个字符 列的 IDSpl_2 具有 ID 字符的其余部分( 5:10)。

预期的 output 会是这样的:

output:

    ID         Var1 Var2    Spl_1   Spl_2
1   0334KLM001  aa  xx       0334   KLM001
2   1334HDM002  zvv rr       1334   HDM002
3   2334WEM003  qetr qwe     2334   WEM003
4   3334OKT004  ff  sdf     3334    OKT004
5   4334WER005  ee  sdf     4334    WER005
6   5334BBC006  qly ssg     5334    BBC006
7   6334QQQ007  kk  htj     6334    QQQ007
8   7334AAA008  uu  yjy     7334    AAA008
9   8334CBU009  ww  wttt    8334    CBU009
10  9334MLO010  aa  dg      9334    MLO010

我看了下面的问题:Q1 & .Although very informative but still I did not get that how to split the sting by character numbers. I found the ‘stringr' package,我用str_sub命令学习的,我可以按数字拆分。见下文:

 library(stringr)
ID <- "0334KLM001"
str_sub(ID, c(1,5), c(4,10))
[1] "0334"   "KLM001"

但我不知道如何结合其他 r 命令来获得上面提供的 output

我们可以用separate

library(tidyr)
separate(df, ID, into = c("Spl_1", "Spl_2"), sep = 4, remove = FALSE)
#           ID Spl_1  Spl_2 Var1 Var2
#1  0334KLM001  0334 KLM001   aa   xx
#2  1334HDM002  1334 HDM002  zvv   rr
#3  2334WEM003  2334 WEM003 qetr  qwe
#4  3334OKT004  3334 OKT004   ff  sdf
#5  4334WER005  4334 WER005   ee  sdf
#6  5334BBC006  5334 BBC006  qly  ssg
#7  6334QQQ007  6334 QQQ007   kk  htj
#8  7334AAA008  7334 AAA008   uu  yjy
#9  8334CBU009  8334 CBU009   ww wttt
#10 9334MLO010  9334 MLO010   aa   dg

如果我们想要3列,我们可以在sep

中传递一个vector
separate(df, ID, into = c("Spl_1", "Spl_2", "Spl_3"), sep = c(4,8), remove = FALSE)
#           ID Spl_1 Spl_2 Spl_3 Var1 Var2
#1  0334KLM001  0334  KLM0    01   aa   xx
#2  1334HDM002  1334  HDM0    02  zvv   rr
#3  2334WEM003  2334  WEM0    03 qetr  qwe
#4  3334OKT004  3334  OKT0    04   ff  sdf
#5  4334WER005  4334  WER0    05   ee  sdf
#6  5334BBC006  5334  BBC0    06  qly  ssg
#7  6334QQQ007  6334  QQQ0    07   kk  htj
#8  7334AAA008  7334  AAA0    08   uu  yjy
#9  8334CBU009  8334  CBU0    09   ww wttt
#10 9334MLO010  9334  MLO0    10   aa   dg

如果开头的数字不定长,就用extract

extract(df, ID, into = c("Spl_1", "Spl_2"), "^([0-9]+)(.*)", remove = FALSE)

对于 3 列,

extract(df, ID, into = c("Spl_1", "Spl_2", "Spl_3"), "(.{4})(.{4})(.*)", remove = FALSE)