【问题标题】:Replace one digit numbers (1 or 5B) in a string with two digits (01 or 05B)将字符串中的一位数字(1 或 5B)替换为两位数字(01 或 05B)
【发布时间】:2019-11-21 03:58:38
【问题描述】:

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

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')

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

我尝试了几种方法,例如 gsub("(\\d)+", "0\\1", myvec),但都没有成功。

谢谢!

【问题讨论】:

    标签: r regex gsub


    【解决方案1】:

    我们可以使用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" 
    

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


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

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

    【讨论】:

    • 感谢您的回答!当我复制粘贴您的命令时,它会插入相应数量的空格而不是零。我还开始了一个新的 R 会话,以查看我更改的某些选项是否可能导致它,但它再次插入了空格。从技术上讲,这也可以解决我比较块和数字的问题,但我很困惑为什么我会得到不同的结果。
    • @sh_student 这很奇怪。我也重新启动了我的 R 会话,以检查是否有其他原因导致它,但它在新的 R 会话中也同样适用。你可以试试 sprintf("%04d", m)) 而不是 %04s 吗?使用%04d 会向我返回错误,但您可以尝试看看是否得到任何不同的输出?最后我们可以检查 R.version 和 stringr 包版本。我的 R.version 是 3.6.1,stringr1.4.0
    • 插入sprintf("%04d", m)) 会返回错误invalid format '%04d'; use format %s for character objects。我的 R 版本是 3.6.0,stringr 版本是 1.4.0。我会更新我的 R 版本,看看我是否会得到不同的结果。
    • 我更新了我的 R 版本,但使用空格而不是零仍然得到相同的结果
    • 我觉得应该是stringr::str_replace_all(myvec, "\\d+", function(m) sprintf("%04d", as.integer(m)))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    相关资源
    最近更新 更多