【问题标题】:Modifying Strings to transform 1 into 01修改字符串以将 1 转换为 01
【发布时间】:2020-01-23 13:38:29
【问题描述】:

我有一个对象,它是一个带有向量的巨大矩阵,它包含一个三个字母的字符串,后跟一个数字,例如:

"aaa1" , "aaa2" , "aaa3" , "bbb1" ... 

我想重新编写此列,以便值 1-9 包含 01-09,例如:

"aaa01" , "aaa02" , "aaa03" , "bbb01" ... 

有没有办法有效地做到这一点?

我想出的一个解决方案是使用

将字符串与数字分开
a <- substr(object$column , 1 , 3)

然后用sprintf 粘贴字符串

paste(a ,rep(sprintf("%02d",1:50))

有没有更有效的方法来解决这个问题?

编辑:我的样本中的数字可以超过 10

【问题讨论】:

  • 感谢您的回答!如果数字仅达到 9,则该解决方案有效。我再次检查,我的样本的值也超过 10。它们的值类似于 25
  • 看起来不太好但是...paste0(gsub('\\d+', '', v1), sprintf('%02d', as.numeric(gsub('\\D+', '', v1))))
  • 这个解决方案似乎适用于我的情况

标签: r


【解决方案1】:

您可以使用sub 在第三个字符后添加一个 0,如下所示:

data <- c("aaa1" , "aaa2" , "aaa3" , "bbb1")
sub('^(.{3})(.*)$', '\\10\\2', data)

结果:

[1] "aaa01" "aaa02" "aaa03" "bbb01"

编辑:

如果您想在第 3 个字符后添加 0,但仅适用于名称后有 1 位数字的名称,请将 * 更改为 ?,以指定您在出现次数为 1 时采用表达式:

v <- c("aaa1" , "aaa2" , "aaa3" , "bbb13", "aaa43")
sub('^(.{3})(.?)$', '\\10\\2', v)

结果:

[1] "aaa01" "aaa02" "aaa03" "bbb13" "aaa43"

正如@manotheshark 所指出的,您可以更严格的字符串模式匹配规则,通过指定第三个字符必须是带有w{3} 的单词字符,并且插入0 的位置必须是1带\\d的数字:

sub('^(\\w{3})(\\d)$', '\\10\\2', v)  

【讨论】:

  • 感谢您的回答!该解决方案有效,但前提是字符串后面的数字可以取 1 到 9 之间的值。我再次检查,我的样本可以有高于 9 的数字,即可能有“aaa35”
  • 为确保结果符合预期,最好是明确的而不是使用通配符:sub('^(\\w{3})(\\d)$', '\\10\\2', v)
  • 谢谢,我已将您的建议添加到答案中
【解决方案2】:

一种方法是使用 sub

Orig  = c("aaa1" , "aaa2" , "aaa3" , "bbb1")
sub("([a-z])(\\d)\\b", "\\10\\2", Orig)

[1]“aaa01”“aaa02”“aaa03”“bbb01”

【讨论】:

    【解决方案3】:

    基本 R 解决方案

    s <- c("aaa1" , "aaa2" , "aaa3" , "bbb1")
    gsub("([[:alpha:]]+)","\\10",s)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      相关资源
      最近更新 更多