Reputation: 1015
I have two strings:
mystring1 <- c("hello i am a cat. just kidding, i'm not a cat i'm a cat. dogs are the best animal. not cats!")
mystring2 <- c("hello i am a cat. just kidding, i'm not a cat i'm a cat. but i have a cat friend that is a cat.")
I want to change the third occurrence of the word cat in both strings to dog.
Ideally, string1
and string2
would read:
mystring1
[1] "hello i am a cat. just kidding, i'm not a cat i'm a dog. dogs are the best animal. not cats!"
mystring2
[1] "hello i am a cat. just kidding, i'm not a cat i'm a dog. but i have a cat friend that is a cat."
What is the best way of doing this? Up until now I have only used gsub
to replace characters but I don't know if this can be used to replace specific occurrences of a character.
Upvotes: 6
Views: 620
Reputation: 28705
You can use gsubfn
library(gsubfn)
p <- proto(fun = function(this, x) if(count == 3) 'dog' else x)
gsubfn('cat', p, c(mystring1, mystring2))
# [1] "hello i am a cat. just kidding, i'm not a cat i'm a dog. dogs are the best animal. not cats!"
# [2] "hello i am a cat. just kidding, i'm not a cat i'm a dog. but i have a cat friend that is a cat."
Or, if it needs to be surrounded by word boundaries,
gsubfn('\\bcat\\b', p, c(mystring1, mystring2), perl = TRUE)
# [1] "hello i am a cat. just kidding, i'm not a cat i'm a dog. dogs are the best animal. not cats!"
# [2] "hello i am a cat. just kidding, i'm not a cat i'm a dog. but i have a cat friend that is a cat."
Upvotes: 1
Reputation: 16988
You could use
mystring1 <- c("hello i am a cat. just kidding, i'm not a cat i'm a cat. dogs are the best animal. not cats!")
mystring2 <- c("hello i am a cat. just kidding, i'm not a cat i'm a cat. but i have a cat friend that is a cat who knows a cat knowing a cat.")
sub("((cat.*?){2})\\bcat\\b", "\\1dog", mystring1, perl=TRUE)
which gives
> sub("((cat.*?){2})\\bcat\\b", "\\1dog", c(mystring1, mystring2), perl=TRUE)
[1] "hello i am a cat. just kidding, i'm not a cat i'm a dog. dogs are the best animal. not cats!"
[2] "hello i am a cat. just kidding, i'm not a cat i'm a dog. but i have a cat friend that is a cat who knows a cat knowing a cat."
Upvotes: 8