r 用 0 和破折号格式化数字
r Format numbers with 0 and dashes
我正在处理下面这样的数字
12344
233345
7233433
9343883
3432837
我正在尝试格式化这些数字,使它们的长度和每三个数字后的短划线 (-) 都相同。最终的预期结果应该如下所示。
0-012-344
0-233-345
7-233-433
9-343-883
3-432-837
非常感谢以这种方式格式化这些数字的任何帮助。
尝试 formatC
:
formatC(x, width = 7, format = "d", flag = "0", big.mark = '-')
# [1] "0-012-344" "0-233-345" "7-233-433" "9-343-883" "3-432-837"
使用的数据:
x <- scan(textConnection('12344
233345
7233433
9343883
3432837'))
首先,您需要构建长度为 7 且前导零的字符串。我用了 this:
strReverse <- function(x)
sapply(lapply(strsplit(x, NULL), rev), paste, collapse="")
v = as.character(read.table(text = " 12344
233345
7233433
9343883
3432837", header = FALSE)[,1])
v1 = strReverse( substring(paste0(strReverse(v), "0000"), 1, 7))
结果:
> v1
[1] "0012344" "0233345" "7233433" "9343883" "3432837"
添加破折号应该很简单,现在:
paste0(substring(v1,1,1), "-", substring(v1,2,4), "-", substring(v1,5,7))
这是另一个解决方案,
my_format <- function(num){
x <- sprintf("%07d", num)
paste0(substr(x, 1,1), "-",
substr(x, 2,4), "-",
substr(x, 5,7))
}
nums <- c(12344,233345,7233433,9343883,3432837)
my_format(nums)
# gives
[1] "0-012-344" "0-233-345" "7-233-433" "9-343-883" "3-432-837"
我们可以使用 stringr
和 purrr
。
# Data
numbers <- c("12344", "233345", "7233433", "9343883", "3432837")
# Load package
library(stringr)
library(purrr)
# A function to add dash line
trans_num <- function(number){
part1 <- str_sub(number, start = 1, end = 1)
part2 <- str_sub(number, start = 2, end = 4)
part3 <- str_sub(number, start = 5)
return(paste(part1, part2, part3, sep = "-"))
}
numbers %>%
str_pad(width = 7, pad = "0") %>%
map_chr(trans_num)
[1] "0-012-344" "0-233-345" "7-233-433" "9-343-883" "3-432-837"
这是一个 base R
选项,其中包含 sub
和 sprintf
sub("(.)(.{3})", '\1-\2-', sprintf("%07d", x))
#[1] "0-012-344" "0-233-345" "7-233-433" "9-343-883" "3-432-837"
我正在处理下面这样的数字
12344
233345
7233433
9343883
3432837
我正在尝试格式化这些数字,使它们的长度和每三个数字后的短划线 (-) 都相同。最终的预期结果应该如下所示。
0-012-344
0-233-345
7-233-433
9-343-883
3-432-837
非常感谢以这种方式格式化这些数字的任何帮助。
尝试 formatC
:
formatC(x, width = 7, format = "d", flag = "0", big.mark = '-')
# [1] "0-012-344" "0-233-345" "7-233-433" "9-343-883" "3-432-837"
使用的数据:
x <- scan(textConnection('12344
233345
7233433
9343883
3432837'))
首先,您需要构建长度为 7 且前导零的字符串。我用了 this:
strReverse <- function(x)
sapply(lapply(strsplit(x, NULL), rev), paste, collapse="")
v = as.character(read.table(text = " 12344
233345
7233433
9343883
3432837", header = FALSE)[,1])
v1 = strReverse( substring(paste0(strReverse(v), "0000"), 1, 7))
结果:
> v1
[1] "0012344" "0233345" "7233433" "9343883" "3432837"
添加破折号应该很简单,现在:
paste0(substring(v1,1,1), "-", substring(v1,2,4), "-", substring(v1,5,7))
这是另一个解决方案,
my_format <- function(num){
x <- sprintf("%07d", num)
paste0(substr(x, 1,1), "-",
substr(x, 2,4), "-",
substr(x, 5,7))
}
nums <- c(12344,233345,7233433,9343883,3432837)
my_format(nums)
# gives
[1] "0-012-344" "0-233-345" "7-233-433" "9-343-883" "3-432-837"
我们可以使用 stringr
和 purrr
。
# Data
numbers <- c("12344", "233345", "7233433", "9343883", "3432837")
# Load package
library(stringr)
library(purrr)
# A function to add dash line
trans_num <- function(number){
part1 <- str_sub(number, start = 1, end = 1)
part2 <- str_sub(number, start = 2, end = 4)
part3 <- str_sub(number, start = 5)
return(paste(part1, part2, part3, sep = "-"))
}
numbers %>%
str_pad(width = 7, pad = "0") %>%
map_chr(trans_num)
[1] "0-012-344" "0-233-345" "7-233-433" "9-343-883" "3-432-837"
这是一个 base R
选项,其中包含 sub
和 sprintf
sub("(.)(.{3})", '\1-\2-', sprintf("%07d", x))
#[1] "0-012-344" "0-233-345" "7-233-433" "9-343-883" "3-432-837"