R 使用条件匹配指定新字符串

R 使用条件匹配指定新字符串,r,regex,gsub,R,Regex,Gsub,我有一个关于有条件地用新字符串替换字符串的问题 到目前为止,我把实际问题的简短版本放在了工作中,但是我需要一个更好的解决方案,因为实际数据中有很多行 strings <- c("ca_A33","cb_A32","cc_A31","cd_A30") 所以最后的字符串应该是 final string <- c("ca_A1","cb_A2","cc_A3","cd_A4") 好吧,看来我们有办法了。但假设我有1000到A1,并且想要将它们从A1替换为1000,我需要执行1000行i

我有一个关于有条件地用新字符串替换字符串的问题

到目前为止,我把实际问题的简短版本放在了工作中,但是我需要一个更好的解决方案,因为实际数据中有很多行

strings <- c("ca_A33","cb_A32","cc_A31","cd_A30")
所以最后的字符串应该是

final string <- c("ca_A1","cb_A2","cc_A3","cd_A4")

好吧,看来我们有办法了。但假设我有1000到A1,并且想要将它们从A1替换为1000,我需要执行1000行
ifelse
语句。我们如何解决这个问题呢?

如果向量是按顺序匹配的,那么您可以使用:

> paste0(gsub("(.*_)(.*)","\\1", strings ), replace_strings)
[1] "ca_A1" "cb_A2" "cc_A3" "cd_A4"

如果向量的顺序是匹配的,则可以使用:

> paste0(gsub("(.*_)(.*)","\\1", strings ), replace_strings)
[1] "ca_A1" "cb_A2" "cc_A3" "cd_A4"

编辑:根据@onyanbu的评论,删除
map2\u chr
作为
paste
是一个矢量化函数

foo <- function(x, y){
  x <- unlist(lapply(strsplit(x, "_"), '[', 1))
  paste(x, y, sep = "_"))
}

foo(strings, replace_strings)

编辑:根据@onyanbu的评论,删除
map2\u chr
作为
paste
是一个矢量化函数

foo <- function(x, y){
  x <- unlist(lapply(strsplit(x, "_"), '[', 1))
  paste(x, y, sep = "_"))
}

foo(strings, replace_strings)

使用
dplyr
软件包:

strings <- c("ca_A33","cb_A32","cc_A31","cd_A30")
replace_strings <- c("A1","A2","A3","A4")
df <- data.frame(strings, replace_strings)

df <- mutate(rowwise(df),
             strings = gsub("_.*",
                            paste0("_", replace_strings),
                            strings)
             )

df <- select(df, strings)

strings使用
dplyr
包:

strings <- c("ca_A33","cb_A32","cc_A31","cd_A30")
replace_strings <- c("A1","A2","A3","A4")
df <- data.frame(strings, replace_strings)

df <- mutate(rowwise(df),
             strings = gsub("_.*",
                            paste0("_", replace_strings),
                            strings)
             )

df <- select(df, strings)

strings您可以使用
regmatches
。首先使用
regexpr
获取紧跟在
\u
后面的所有字符,然后按如下所示进行替换

`regmatches<-`(strings,regexpr("(?<=_).*",strings,perl = T),value=replace_strings)
[1] "ca_A1" "cb_A2" "cc_A3" "cd_A4"

`regmatches您可以使用
regmatches
。首先使用
regexpr
获取紧跟着
\uu
的所有字符,然后按如下所示进行替换

`regmatches<-`(strings,regexpr("(?<=_).*",strings,perl = T),value=replace_strings)
[1] "ca_A1" "cb_A2" "cc_A3" "cd_A4"

`regmatches不是最快的,但非常容易处理和维护:

for (i in 1:length(strings)) {
  strings[i] <- gsub("\\d+$", i, strings[i])
}
for(1中的i:长度(字符串)){

琴弦[i]不是最快的,但非常容易处理和维护:

for (i in 1:length(strings)) {
  strings[i] <- gsub("\\d+$", i, strings[i])
}
for(1中的i:长度(字符串)){
字符串[i]还有另一种方式:

mapply(function(x,y) gsub("(\\w\\w_).*",paste0("\\1",y),x),strings,replace_strings,USE.NAMES=FALSE)
# [1] "ca_A1" "cb_A2" "cc_A3" "cd_A4"
还有另一种方式:

mapply(function(x,y) gsub("(\\w\\w_).*",paste0("\\1",y),x),strings,replace_strings,USE.NAMES=FALSE)
# [1] "ca_A1" "cb_A2" "cc_A3" "cd_A4"

在向量未排序的情况下,我们如何才能做到这一点?像我使用if else一样将A33匹配到A1?您可以在函数外部创建一个引用对象,并映射到函数内部的该值。这是一个比我更完整的答案。我想这就是您要寻找的@AlexanderPaste是一个向量化函数。您不需要map2_chr..只需粘贴(x,y,sep=“-”)在向量未排序的情况下,我们如何才能做到这一点?像我使用if else一样将A33匹配到A1?您可以在函数外部创建一个引用对象,并映射到函数内部的该值。这是一个比我更完整的答案。我想这就是您要寻找的@AlexanderPaste是一个向量化函数。您不需要map2_chr..只需粘贴(x,y,sep=“-”)即可。感谢您提供的所有解决方案。希望它们对其他用户有用。干杯!感谢您提供的所有解决方案。希望它们对其他用户有用。干杯!