添加' /'到R中的数值

时间:2018-06-07 16:30:54

标签: r regex

我的数值是nchar = 7或8。

例如,让我说我有这两个值:

1234567
12345678

我想做的是:

If nchar(x) = 7

然后在第一个值和第三个值之后添加/

所以,我的结果看起来像这样:

1/23/4567

if nchar(x) = 8,然后在第2和第4个值之后添加/。 结果:12/34/5678

5 个答案:

答案 0 :(得分:3)

我们可以在这里使用sub

x <- "12345678"
sub("(\\d+)(\\d{2})(\\d{4})$", "\\1/\\2/\\3", x)

Demo

答案 1 :(得分:1)

以下内容应该有效(我们从最后开始计算,这极大地简化了事情):

stringr::str_replace(num, '(..)(....)$', '/\\1/\\2')

作为替代方案,由于您正在处理数字,请考虑使用 numeric 操作:

paste(num %/% 1e6, num %% 1e6 %/% 1e4, num %% 1e4, sep = '/')

(执行整数除法和余数运算以提取相关的数字组。)

请注意,如果您的数字具有前导零,则这些结果会产生不同的结果。根据您在这种情况下的要求,第一个(或第二个)解决方案可能不合适。

答案 2 :(得分:1)

是否必须使用正则表达式?

怎么样:

test <- '1234567'
n <- nchar(test)

test_split <- strsplit(test, '')[[1]]

paste0(paste0(test_split[1:(n - 6)], collapse = ''), '/',
       paste0(test_split[(n - 5):(n - 4)], collapse = ''), '/',
       paste0(test_split[(n - 3):n], collapse = ''))

答案 3 :(得分:1)

n <- nchar(x)
paste(substr(x, 1, n - 6), 
      substr(x, n - 5, n - 4), 
      substr(x, n - 3, n), 
      sep = '/')

似乎比使用sub

快一点
x <- sample(c("12345678", "1234567"), 1e6, T)
library(microbenchmark)
microbenchmark(
  sub   = {sub("(\\d+)(\\d{2})(\\d{4})$", "\\1/\\2/\\3", x)},
  paste = { n <- nchar(x)
            paste(substr(x, 1, n - 6), 
                  substr(x, n - 5, n - 4), 
                  substr(x, n - 3, n), 
                  sep = '/')},
  times = 10
)
# Unit: milliseconds
#   expr      min       lq     mean   median       uq       max neval
#    sub 868.1314 897.1632 942.0971 926.6259 953.9557 1137.5071    10
#  paste 687.1708 703.5417 741.0434 714.0114 766.5217  914.2754    10

答案 4 :(得分:1)

您可以使用formatC进行一些黑客攻击来解释变量标记长度:

formatC(c(1234567,12345678)/100, big.mark="/", big.interval=2, decimal.mark="", mode="double", digits=8)
[1] "1/23/4567"  "12/34/5678"

基本上,您将最后两位数字移动到小数点的另一侧,使其不可见,然后对小数点左侧的每两位数使用/个大数字。