使用R将长整数(ID字段)拆分为子字段

时间:2015-03-25 14:01:05

标签: regex r

我有一个向量,如果ID我需要分成子字段。子场的长度是不变的,我希望这会让事情变得简单明了。目前,ID字段如下所示:

ID
0100001000
0100002000
0100003000
0100004000
0100005000
0100006000
0100007000
0100008000
0100009000
0100010000

我需要将其拆分为子ID字段,如下所示:

06  00546   000
12  00387   000
21  02437   000
01  06419   000
17  03892   000
17  00010   000
13  02199   000
17  00706   000
05  03358   000
05  03892   000

这些值只是格式的示例,而不是内容,即上面的示例只显示我需要取一串xxxxxxxxxx并将其转换为xx xxxxx xxx,请忽略这些值。

我正在寻找一个我可以在R中实现的解决方案,我觉得我需要使用正则表达式,但需要在正确的方向上轻推。

2 个答案:

答案 0 :(得分:4)

一个选项是

library(tidyr)
extract(df1, 'ID', into=c('ID1', 'ID2', 'ID3'), '(.{2})(.{5})(.{3})')
#    ID1   ID2 ID3
# 1   01 00001 000
# 2   01 00002 000
# 3   01 00003 000
# 4   01 00004 000
# 5   01 00005 000
# 6   01 00006 000
# 7   01 00007 000
# 8   01 00008 000
# 9   01 00009 000
#10   01 00010 000

或者使用指定为read.fwf的{​​{1}}来阅读该文件。

widths

答案 1 :(得分:2)

你也可以这样做。

> df <- data.frame(ID=c("0100001000", "0100002000", "0100003000"))
> df
          ID
1 0100001000
2 0100002000
3 0100003000
> as.data.frame(do.call(rbind, regmatches(df$ID, gregexpr("^\\d{2}|(?<=^\\d{2})\\d{5}|\\d{3}$", df$ID,perl=T))))
  V1    V2  V3
1 01 00001 000
2 01 00002 000
3 01 00003 000

> library(stringi)
> as.data.frame(do.call(rbind, stri_split(as.character(df$ID), regex="(?<=^\\d{2})|(?=\\d{3}$)")))
  V1    V2  V3
1 01 00001 000
2 01 00002 000
3 01 00003 000