R字符串操作: How could i optimize this one?

标签 r printf

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/

相关文章:

r - ggplot2: "Unknown parameters: probs"for fun.y = geom_line() 中的分位数

R 函数求给定列值的 c 之和

r - 如何判断 R 中的数据集何时太大?

r - 检查向量中的每个数字是否在 R 中另一个向量中的某些数字之间

c++ - 如何通过屏幕右侧的输出而不是 C 中通常的左侧进行打印?

c - 使用 printf 打印可变位数的 double

C sprintf覆盖?

c++ - GCC printf 优化

c - 从 C 中的字符串打印特定字符

R 并行中止所有 mclapply 操作