我的数值是nchar = 7或8。
例如,让我说我有这两个值:
1234567
12345678
我想做的是:
If nchar(x) = 7
然后在第一个值和第三个值之后添加/
。
所以,我的结果看起来像这样:
1/23/4567
if nchar(x) = 8
,然后在第2和第4个值之后添加/
。
结果:12/34/5678
。
答案 0 :(得分:3)
答案 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"
基本上,您将最后两位数字移动到小数点的另一侧,使其不可见,然后对小数点左侧的每两位数使用/
个大数字。