使用sprintf()添加尾随零

时间:2015-11-11 17:43:56

标签: r

必须有一种简单的方法来做到这一点,我忽略了它。但是如果我有一系列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

3 个答案:

答案 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"