R 3.1.2 - 粘贴元字符以在函数中使用

时间:2015-03-20 11:43:31

标签: r

我正在尝试编写一个函数,让我可以轻松替换以某些字符开头的字符串。我编写了以下函数,但是当我将它们粘贴到字符串中时,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)

1 个答案:

答案 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"

如果您需要传递项目向量和替换向量 ,则可以将gsubfor循环合并:< / 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"