在第一次宣传之前添加前导零

时间:2016-09-08 06:38:03

标签: r

我的数据如下

98-45.3A-22
104-44.0A-23
983-29.1-22
1757-42.5A-22
4968-37.3A2-23

我想添加前导零,以便在第一次宣传之前将数字设为6位数

000098-45.3A-22
000104-44.0A-23
000983-29.1-22
001757-42.5A-22
004968-37.3A2-23 

2 个答案:

答案 0 :(得分:2)

我们可以使用sub在第一个-之前提取数字,方法是匹配-后跟一个或多个字符(.*),直到字符串结尾,将其替换为"",将其转换为numericas.numeric),并通过匹配从-的第一个实例中提取子字符串,直到字符串结尾从字符串开头不是-[^-]+)的一个或多个字符,将其替换为""。将这些子字符串用作sprintf中的参数,并使用正确的fmt将其粘贴在一起。

df1$V1 <- sprintf("%06d%s", as.numeric(sub("\\-.*", "", df1$V1)), sub("^[^-]+", "", df1$V1))
df1
#               V1
#1  000098-45.3A-22
#2  000104-44.0A-23
#3   000983-29.1-22
#4  001757-42.5A-22
#5 004968-37.3A2-23

我们也可以使用gsubfn一步完成此操作。在这里,我们匹配字符串开头(\\d+)的数字(^),将其捕获为一个组,在替换中,将捕获的组转换为numeric并更改sprintf

的格式
library(gsubfn)
gsubfn("^(\\d+)", ~sprintf("%06d", as.numeric(x)), df1$V1)
#[1] "000098-45.3A-22"  "000104-44.0A-23"  "000983-29.1-22"   
#[4] "001757-42.5A-22"  "004968-37.3A2-23"

数据

df1 <- structure(list(V1 = c("98-45.3A-22", "104-44.0A-23", "983-29.1-22", 
"1757-42.5A-22", "4968-37.3A2-23")), .Names = "V1", class = "data.frame", 
row.names = c(NA, -5L))

答案 1 :(得分:-6)

由于我有超过5Lakh行要重新编写Sprintf需要花费大量时间。因此,下面比sprintf快

df1$V1 <- str_replace(df1$V1, str_extract(df1$V1, "\\d+"), str_pad(str_extract(df1$V1, "\\d+"), 6, pad = "0"))