Martin Batholdy
2009-Oct-05 14:34 UTC
[R] gsub - replace multiple occurences with different strings
Hi, I search a way to replace multiple occurrences of a string with different strings depending on the place where it occurs. I tried the following; x <- c("xx y e d xx e t f xx e f xx") x <- gsub("xx", c("x1", "x2", "x3", "x4"), x) what I want to get is; x x1 y y e d x2 e t f x3 e f x4 but what I get is; x x1 y y e d x1 e t f x1 e f x1 [[alternative HTML version deleted]]
William Dunlap
2009-Oct-05 15:19 UTC
[R] gsub - replace multiple occurences with different strings
> -----Original Message----- > From: r-help-bounces at r-project.org > [mailto:r-help-bounces at r-project.org] On Behalf Of Martin Batholdy > Sent: Monday, October 05, 2009 7:34 AM > To: r help > Subject: [R] gsub - replace multiple occurences with different strings > > Hi, > > I search a way to replace multiple occurrences of a string with > different strings > depending on the place where it occurs. > > > I tried the following; > > x <- c("xx y e d xx e t f xx e f xx") > x <- gsub("xx", c("x1", "x2", "x3", "x4"), x) > > > what I want to get is; > > x > x1 y y e d x2 e t f x3 e f x4You have a doubled y in the output but not the input, I'll assume the input is correct. I extended x to three similar strings: x <- c("xx y e d xx e t f xx e f xx", "xx y e d xx e t f xx", "xx y e d xx e t f xx e f xxxx y e d xx e t f xx e f xx") If you know you always have 4 xx's you can use sub (or gsub), but it doesn't work properly if there are not exactly 4 xx's: > sub("xx(.*)xx(.*)xx(.*)xx", "x1\\1x2\\2x3\\3x4", x) [1] "x1 y e d x2 e t f x3 e f x4" [2] "xx y e d xx e t f xx" [3] "x1 y e d xx e t f xx e f xxxx y e d x2 e t f x3 e f x4" You can use gsubfn() from package gsubfn along with a function that maintains a count of how many times it has been called, as in > gsubfn("xx", local({n<-0;function(x){n<<-n+1;paste(x,n,sep="")}}), x) [1] "xx1 y e d xx2 e t f xx3 e f xx4" [2] "xx5 y e d xx6 e t f xx7" [3] "xx8 y e d xx9 e t f xx10 e f xx11xx12 y e d xx13 e t f xx14 e f xx15" If you want the count to start anew with each string in the vector you can use sapply. Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com> > > but what I get is; > > x > x1 y y e d x1 e t f x1 e f x1 > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >