用两位数字(01或05B)替换一位数字(1或5B)

问题描述 投票:0回答:1

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

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)的方法,但没有成功。

谢谢!

r regex gsub
1个回答
0
投票

我们可以使用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"    
© www.soinside.com 2019 - 2024. All rights reserved.