假定以下矢量字符的数字格式不一致:
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)
之类的几种方法,但是没有成功。
谢谢!
答案 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)))