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

时间:2017-01-26 15:10:17

标签: r string dataframe split text-processing

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具有前四个字符ID列中的em>和Spl_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& Q2。虽然提供了非常丰富的信息,但我仍然没有得到如何通过字符数来分割刺痛。我找到了'stringr'包,我用str_sub命令学习,我可以按编号拆分。见下文:

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

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

1 个答案:

答案 0 :(得分:2)

我们可以使用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

vector

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

中传递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)

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

和3列,

pandas