我有一个向量,如果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中实现的解决方案,我觉得我需要使用正则表达式,但需要在正确的方向上轻推。
答案 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