用加法替换字符串的数字部分

时间:2018-12-04 12:48:51

标签: r regex

我有一个包含100多个元素的大型列表。我想在ID上加上200。

var <- c("ID66Session1_Date-2017-02-28__10-38.csv","ID66Session2_Date-2017-03-04__21-31.csv","ID66Session3_Date-2017-03-07__19-17.csv",
         "ID66Session4_Date-2017-03-09__18-08.csv","ID66Session5_Date-2017-03-15__16-26.csv","ID66Session6_Date-2017-04-15__23-39.csv",
         "ID6Session1_Date-2017-01-20__11-06.csv")

aim <- c("ID266Session1_Date-2017-02-28__10-38.csv","ID266Session2_Date-2017-03-04__21-31.csv","ID266Session3_Date-2017-03-07__19-17.csv",
         "ID266Session4_Date-2017-03-09__18-08.csv","ID266Session5_Date-2017-03-15__16-26.csv","ID266Session6_Date-2017-04-15__23-39.csv",
         "ID206Session1_Date-2017-01-20__11-06.csv")

我相信可以用grepl解决这个问题。但是也欢迎其他解决方案。我正在寻找一个方便且简短的代码。

2 个答案:

答案 0 :(得分:2)

gsubfn正是为此:

library(gsubfn)
gsubfn("((?<=ID)\\d+)", function(x, ...) as.numeric(x) + 200, var, perl = TRUE)
# [1] "ID266Session1_Date-2017-02-28__10-38.csv" "ID266Session2_Date-2017-03-04__21-31.csv"
# [3] "ID266Session3_Date-2017-03-07__19-17.csv" "ID266Session4_Date-2017-03-09__18-08.csv"
# [5] "ID266Session5_Date-2017-03-15__16-26.csv" "ID266Session6_Date-2017-04-15__23-39.csv"
# [7] "ID206Session1_Date-2017-01-20__11-06.csv"

为避免用“ ID” +(200 + ID值)+“ Session ...”构造替换值,我们在后面使用了正数:如果我们后面有“ ID”,则我们将所有后续值数字。然后将它们转换为数字并添加200。

答案 1 :(得分:1)

这是使用stringrpurrr的解决方案

library(stringr)
library(purrr)
map_chr(map(str_split(var, "(?<=ID)"), function(x)
    unlist(str_split(x, "(?=Session)"))), function(y)
        paste0(y[1], as.numeric(y[2]) + 200, y[3]))
#[1] "ID266Session1_Date-2017-02-28__10-38.csv"
#[2] "ID266Session2_Date-2017-03-04__21-31.csv"
#[3] "ID266Session3_Date-2017-03-07__19-17.csv"
#[4] "ID266Session4_Date-2017-03-09__18-08.csv"
#[5] "ID266Session5_Date-2017-03-15__16-26.csv"
#[6] "ID266Session6_Date-2017-04-15__23-39.csv"
#[7] "ID206Session1_Date-2017-01-20__11-06.csv"

说明:我们将var分为三个部分,使用正向前后看:第1部分以ID结尾,第2部分在ID和{之间(但不包括) {1}}(即包含ID号的相关部分),第3部分以Session开头。然后,我们将中间部分Session转换并在连接所有三个部分之前加200。