r - 在 R 中将数字添加到字母数字字符串的有效方法

标签 r string tidyr stringr

我有一个 data.frame id 由字母数字字符序列组成(例如, id = c(A001, A002, B013) )。我在 stringr 下寻找一个简单的功能或 stirngi这可以很容易地用这个字符串做数学运算(id + 1 应该返回 c(A002, A003, B014) )。

我制作了一个可以解决问题的自定义函数,但是我觉得必须有更好/更有效/包内的方式来实现这一点。

str_add_n <- function(df, string, n, width=3){

  string <- enquo(string)

  ## split the string using pattern
df <-  df %>%
    separate(!!string,
             into = c("text", "num"), 
             sep = "(?<=[A-Za-z])(?=[0-9])",
             remove=FALSE
    ) %>%
    mutate(num = as.numeric(num),
           num = num + n,
           num = stringr::str_pad(as.character(num),
                                  width = width,
                                  side = "left",
                                  pad = 0 
                                  )
           ) %>%
    unite(next_string, text:num, sep = "")


return(df)  
}

让我们做一个玩具df
df <- data.frame(id = c("A001", "A002", "B013"))
str_add_n(df, id, 1)
    id next_string
1 A001        A002
2 A002        A003
3 B013        B014

同样,这有效,我想知道是否有更好的方法来做到这一点,欢迎所有调整!

更新

根据建议的答案,我进行了一些基准测试,看起来两者都非常接近,我倾向于 str_add_n_2 (我改了名字,可以同时运行,并接受了 x<-as.character(x) 的建议)
microbenchmark::microbenchmark(question = str_add_n(df, id, 1),
 answer = df %>% mutate_at(vars(id), funs(str_add_n_2(., 1))),
 string_add = df %>% mutate_at(vars(id), funs(string_add(as.character(.)))))

哪个产量
Unit: milliseconds
       expr      min       lq     mean   median       uq
   question 4.312094 4.448391 4.695276 4.570860 4.755748
     answer 2.932146 3.017874 3.191262 3.117627 3.240688
 string_add 3.388442 3.466466 3.699363 3.534416 3.682762
      max neval cld
 10.29253   100   c
  8.24967   100 a  
  9.05441   100  b 

欢迎更多的调整!

最佳答案

这是 gsubfn 的方法

id <- c("A001", "A002", "B013")

library(gsubfn)
gsubfn("([0-9]+)", function(x) sprintf("%03.0f", as.numeric(x) + 1), id)
#[1] "A002" "A003" "B014"

你可以把它变成一个函数
string_add <- function(string, add = 1, width = 3) {
  gsubfn::gsubfn("([0-9]+)", function(x) sprintf(paste0("%0", width, ".0f"), as.numeric(x) + add), string)
}

string_add(id, add = 10, width = 5)
#"A00011" "A00012" "B00023"

关于r - 在 R 中将数字添加到字母数字字符串的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53659764/

相关文章:

string - 解析没有空格的算术计算

java - 具有特殊字符的字符串解析

r - 使用 R 中的 dplyr 对所有变量组合求和

r - 分析 R : Linear, 岭回归中的相关数据,PCR

r - 将 .rmd 文件编织为 .md 并使用不同的名称将 .md 文件上一级保存

c - 如何在C中向后读取文件?

r - 如何从 tibble 中删除非缺失值与其他行中的值子集匹配的行?

r - 在R中按字母顺序对全名进行排序

使用 dplyr 根据另一个向量替换 NA 每列

R:plotmath 表达式符号未显示在交互图中