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案例...但没有它它可行,但太慢了.
这依赖于一个外部包,但是你的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")