我的数据如下
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
答案 0 :(得分:2)
我们可以使用sub
在第一个-
之前提取数字,方法是匹配-
后跟一个或多个字符(.*
),直到字符串结尾,将其替换为""
,将其转换为numeric
(as.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"))