将字符串中的一位数字(1或5B)替换为两位数字(01或05B)

时间:2019-11-21 03:58:38

标签: r regex gsub

假定以下矢量字符的数字格式不一致:

myvec <- c( '50% of population live in block 50 number 27-04', 
'And 1% of population live in block 8 number 1-42', 
'And 1% of population live in block 5B number 1-8', 
'60% of population live in block 1641 number 17-23',
'80% of population live in block 677B number 5-3')

我想要一种一致的数字格式,以便每个数字至少包含两位数字:

c( '50% of population live in block 50 number 27-04', 
'And 01% of population live in block 08 number 01-42', 
'And 01% of population live in block 05B number 01-08', 
'60% of population live in block 1641 number 17-23',
'80% of population live in block 677B number 05-03')

如果将所有数字都简化为4位(最大位数)也可以:

c( '0050% of population live in block 0050 number 0027-0004', 
'And 0001% of population live in block 0008 number 0001-0042', 
'And 0001% of population live in block 0005B number 0001-0008', 
'0060% of population live in block 1641 number 0017-0023',
'0080% of population live in block 0677B number 0005-0003')

重要的是,所有具有相同数字位数的数字都遵循相同的格式。最后,我想读出块和编号(例如,“ 50号块编号27-04”)并检查重复项(实际矢量要长得多,并且由块和编号中的重复项组成,但之前带有不同的文本)-目前我无法做到,因为字符串的开头可能会有所不同。

我尝试了诸如gsub("(\\d)+", "0\\1", myvec)之类的几种方法,但是没有成功。

谢谢!

1 个答案:

答案 0 :(得分:3)

我们可以使用stringr::str_replace_all将字符串中的所有数字替换为4位数字。

stringr::str_replace_all(myvec, "\\d+", function(m) sprintf("%04s", m))
#[1] "0050% of population live in block 0050 number 0027-0004"     
#[2] "And 0001% of population live in block 0008 number 0001-0042" 
#[3] "And 0001% of population live in block 0005B number 0001-0008"
#[4] "0060% of population live in block 1641 number 0017-0023"     
#[5] "0080% of population live in block 0677B number 0005-0003" 

您可以用输出中所需的位数替换"%04s"中的sprintf部分。


出于某种原因,%04s仅对我有用。将提取的部分转换为整数后,我们可以按照@Jaap的建议使用%04d

stringr::str_replace_all(myvec, "\\d+", function(m) sprintf("%04d", as.integer(m)))