我有一个包含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解决这个问题。但是也欢迎其他解决方案。我正在寻找一个方便且简短的代码。
答案 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)
这是使用stringr
和purrr
的解决方案
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。