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=“-”)即可。感谢您提供的所有解决方案。希望它们对其他用户有用。干杯!感谢您提供的所有解决方案。希望它们对其他用户有用。干杯!