TL;DR :我想通过左侧的给定字符将列表的每个字符串补全到给定的大小。我要快点请参阅下面的代码和示例
我有一个非常大的字符串向量,包含......好吧任何东西,但具有最大(已知)字符数。我想通过左零来完成给定大小的字符串(优于最大字符数)
假设:
c("yop",NA,"1234567","19","12AN","PLOP","5689777")
例如,目标大小为 10,我想要:
[1] "0000000yop" NA "0001234567" "0000000019" "00000012AN" "000000PLOP" "0005689777"
因此,尽可能快。
我试过自己写,但速度不是很快...你能帮我让它更快吗?我有数十亿人要治疗。
这是我的实际代码:
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)
这段代码甚至没有处理 NA 的情况......但是没有它它可以工作,但是太慢了。
最佳答案
这依赖于一个外部包,但需要的时间是 zero_left() 函数的 1/30:
nb <- 10
stringr::str_pad(trial, width=nb, pad="0")
[1] "0000000yop" "0001234567" "0000000019" "00000012AN" "000000PLOP" "0005689777"
编辑 1:
是 似乎的Base-R解决方案可能没有只是那么快:
gsub(pattern = " ", replacement = "0", sprintf("%*s", nb, trial), fixed = TRUE)
编辑 2:
记住 stringr
只是 stringi
函数的包装,您可以通过直接使用 stringi
获得另一个速度提升:
stringi::stri_pad_left(试用, width = nb, pad = "0")
关于R字符串操作: How could i optimize this one?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51084727/