R 将前导零添加到特定行

R 将前导零添加到特定行,r,string,dataframe,R,String,Dataframe,我有一个列,它的ID有几个数字,后面是破折号和其他数字。对于破折号前有三位数字的任何id,我需要一个前导0。并且,对于任何在-,后面有一个数字的id,我需要加一个前导零。下面是示例数据 id 222-5 1023-12 102-22 1231-9 我想: id 0222-05 1023-12 0102-22 1231-09 我尝试使用strsplit,但没有成功。有什么建议吗?我们可以使用strsplit按-分割,然后转换成数字,并使用sprintf填充开头的零 df$id <- sa

我有一个列,它的ID有几个数字,后面是破折号和其他数字。对于破折号前有三位数字的任何id,我需要一个前导0。并且,对于任何在-,后面有一个数字的id,我需要加一个前导零。下面是示例数据

id
222-5
1023-12
102-22
1231-9
我想:

id
0222-05
1023-12
0102-22
1231-09

我尝试使用strsplit,但没有成功。有什么建议吗?

我们可以使用
strsplit
-
分割,然后转换成
数字
,并使用
sprintf
填充开头的零

df$id <- sapply(strsplit(df$id, "-"), function(x) 
    do.call(sprintf, c(f = "%04d-%02d", as.list(as.numeric(x)))))

df$id
#[1] "0222-05" "1023-12" "0102-22" "1231-09"
数据
df另一个使用sub的人:
gsub('(?=^\\d{3}\\\)|(?谢谢,@Akrun!
sub("-(\\d)$", "-0\\1", sub("^(\\d{3})-", "0\\1-", df$id))
#[1] "0222-05" "1023-12" "0102-22" "1231-09"
df <- structure(list(id = c("222-5", "1023-12", "102-22", "1231-9")), 
  class = "data.frame", row.names = c(NA, 
-4L))