必须有一种简单的方法来做到这一点,我忽略了它。但是如果我有一系列id
并且想要添加尾随零而未达到字符限制。我在另一篇文章中看到了这个解决方案,但似乎无法将其链接以供参考。
df$id <- c(2331,29623,311,29623)
这样做会得到前导零:
df$id_new <- sprintf("%05s", df$id)
但这样做不会落后于零:
df$id_new <- sprintf("%-05s", df$id)
回答
感谢下面的Richard,我提取了stringr
包并使用以下内容进行测试:
df$id_test <- str_pad(df$id, width=5, side="right", pad="0")
制作人:
id_test
23310
29623
31100
29623
答案 0 :(得分:5)
正如评论中所述,sprintf()
不会这样做。但 stringi 包具有快速简便的填充功能。
id <- c(2331, 29623, 311, 29623)
library(stringi)
stri_pad_left(id, 5, 0)
# [1] "02331" "29623" "00311" "29623"
stri_pad_right(id, 5, 0)
# [1] "23310" "29623" "31100" "29623"
这些函数直接调度到C代码,因此它们应该足够有效。
答案 1 :(得分:1)
我不认为sprintf
会这样做,但您可以使用formatC
来做到这一点
x <- 123
formatC(as.numeric(x), format = 'f', flag='0', digits = 2)
[1] "123.00"
答案 2 :(得分:0)
如果我们坚持-我们可以愚弄sprintf()
做自己不想做的事情:
# Helper function from: stackoverflow.com/a/13613183/4552295
strReverse <- function(x) sapply(lapply(strsplit(x, NULL), rev), paste, collapse="")
so_0padr <- function(x, width = 5) {
strReverse(
sprintf(
"%0*d",
width,
as.integer(
strReverse(
as.character(x)
)
)
)
)
}
产生的结果
so_0padr(c(2331,29623,311,29623))
[1] "23310" "29623" "31100" "29623"