我正在尝试编写一个函数,让我可以轻松替换以某些字符开头的字符串。我编写了以下函数,但是当我将它们粘贴到字符串中时,R似乎不会识别元字符。
library(plyr)
vector <- c("cow", "chicken", "elephant", "garden", "banana")
map.start = function(vector, oldwords, newwords) {
oldwords2 <- paste("^", oldwords, ".*", sep = "")
newvector <- mapvalues(vector, oldwords2, newwords)
return(newvector)
}
vector <- map.start(vector, "eleph", "donkey")
print(vector)
执行这些命令时,会发生以下错误:from
中不存在以下x
值:^ eleph。*
因此,R不会搜索以&#39; eleph&#39;开头的单词,但不会识别元字符并搜索&#34; ^ eleph。*&#34;的完全匹配,当然不存在。有人能告诉我是否可以在函数中组合元字符和字符串(以及如何)?谢谢!
编辑:我尝试使用gsubfn替换多个字符串,但它似乎不起作用。我还在做什么错?
library(gsubfn)
vector <- c("cow", "chicken", "elephant", "garden", "banana")
map.start = function(vector, oldwords, newwords) {
oldwords2 <- paste("^", oldwords, ".*", sep = "")
newvector <- gsubfn(oldwords2, newwords, vector)
return(vector)
}
vector <- map.start(vector, c("eleph", "gard"), c("donkey", "ninja"))
print(vector)
答案 0 :(得分:1)
您可以使用mapvalues
中的gsub
函数替换函数base R
(可与regex
一起使用):
map.start = function(vector, oldwords, newwords) {
oldwords2 <- paste("^", oldwords, ".*", sep = "")
newvector <- gsub(oldwords2, newwords, vector)
return(newvector)
}
vector <- map.start(vector, "eleph", "donkey")
print(vector)
#[1] "cow" "chicken" "donkey" "garden" "banana"
如果您需要传递项目向量和替换向量 ,则可以将gsub
与for
循环合并:< / p>
map.start = function(vector, oldwords, newwords) {
oldwords2 <- paste("^", oldwords, ".*", sep = "")
for (i in 1:length(oldwords2)) {
vector <- gsub(oldwords2[i], newwords[i], vector)
}
return(vector)
}
map.start(vector, c("eleph","chick"), c("donkey","duck"))
#[1] "cow" "duck" "donkey" "garden" "banana"
没有for循环的另一个选项
map.start = function(vector, oldwords, newwords) {
oldwords2 <- paste("^", oldwords, ".*", sep = "")
corresp <- do.call("rbind", mapply(function(x,y) cbind(ind=which(regexpr(x, vector)!=-1), new=y),
x=oldwords2,
y=newwords,
SIMPLIFY=F))
vector[as.numeric(corresp[, "ind"])] <- corresp[, "new"]
return(vector)
}
map.start(vector, c("eleph","chick"), c("donkey","duck"))
#[1] "cow" "duck" "donkey" "garden" "banana"