R字符串操作:我怎么能优化这个?

lrn*_*rnv 3 printf r

TL; DR:我想通过左边的给定字符将列表的每个字符串填充到给定的大小.我想快点.请参阅下面的代码并举例说明

我有很大的字符串向量,包含......很好的东西,但最大(已知)字符数.我希望通过将Zero's留给给定大小来完成thoose字符串(优于char的最大数量)

假设:

c("yop",NA,"1234567","19","12AN","PLOP","5689777")
Run Code Online (Sandbox Code Playgroud)

假设客观大小为10,我希望:

[1] "0000000yop" NA "0001234567" "0000000019" "00000012AN" "000000PLOP" "0005689777"
Run Code Online (Sandbox Code Playgroud)

结果,尽可能快.

我试着写自己的,但它不是很快......你能帮助我加快速度吗?我有数十亿的待办事项.

这是我的实际代码:

library(purrr)
zero_left <- function(field,nb){
  map2_chr(
    map(abs(nb-nchar(field)),~ rep("0",.x)),
    field,
    ~ paste0(c(.x,.y),collapse=""))
}

trial <- c("yop","1234567","19","12AN","PLOP","5689777")
zero_left(trial,10)
Run Code Online (Sandbox Code Playgroud)

这段代码甚至不处理NA案例...但没有它它可行,但太慢了.

sin*_*dur 5

这依赖于一个外部包,但是你的zero_left()函数需要1/30的时间:

nb <- 10
stringr::str_pad(trial, width=nb, pad="0")
[1] "0000000yop" "0001234567" "0000000019" "00000012AN" "000000PLOP" "0005689777"
Run Code Online (Sandbox Code Playgroud)

编辑1:

基地-R解决方案,是 似乎可能是不只是为快:

gsub(pattern = " ", replacement = "0", sprintf("%*s", nb, trial), fixed = TRUE)
Run Code Online (Sandbox Code Playgroud)

编辑2:

记住这stringr只是stringi函数的包装器,你可以通过stringi直接使用获得另一个speedboost :

stringi::stri_pad_left(trial, width = nb, pad = "0")