Marianne Promberger
2010-Feb-22 16:25 UTC
[R] gsub patterns from vector elements w/out loop?
Dear list, I have two vectors: x <- c("one","two") y <- paste(rep(x,2),"blah") I want to replace all occurrences of each element of x in y with something else, so that y looks like this: y [1] "something else blah" "something else blah" "something else blah" [4] "something else blah" I can do this using a loop: for ( i in 1:length(x) ) { y <- gsub(x[i],"something else",y) } Surely, there must be a less kludgy way? I tried looking at the different apply()s but am not getting anywhere, partly because I lack the mental flexibility to combine the fact that I am applying gsub() to y but now want to apply that to x ... erm. :/ Marianne -- Marianne Promberger PhD, King's College London http://promberger.info R version 2.10.1 (2009-12-14) Ubuntu 9.10
Benilton Carvalho
2010-Feb-22 16:48 UTC
[R] gsub patterns from vector elements w/out loop?
gsub("one|two", "something else", y) ? On Mon, Feb 22, 2010 at 4:25 PM, Marianne Promberger <marianne.promberger at kcl.ac.uk> wrote:> Dear list, > > I have two vectors: > > x <- c("one","two") > y <- paste(rep(x,2),"blah") > > I want to replace all occurrences of each element of x in y with > something else, so that y looks like this: > > y > [1] "something else blah" "something else blah" "something else blah" > [4] "something else blah" > > I can do this using a loop: > > for ( i in 1:length(x) ) { > ?y <- gsub(x[i],"something else",y) > } > > Surely, there must be a less kludgy way? > > I tried looking at the different apply()s but am not getting anywhere, > partly because I lack the mental flexibility to combine the fact that > I am applying gsub() to y but now want to apply that to x ... ?erm. :/ > > Marianne > > -- > Marianne Promberger PhD, King's College London > http://promberger.info > R version 2.10.1 (2009-12-14) > Ubuntu 9.10 > > ______________________________________________ > 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. >
On Feb 22, 2010, at 10:25 AM, Marianne Promberger wrote:> Dear list, > > I have two vectors: > > x <- c("one","two") > y <- paste(rep(x,2),"blah") > > I want to replace all occurrences of each element of x in y with > something else, so that y looks like this: > > y > [1] "something else blah" "something else blah" "something else blah" > [4] "something else blah" > > I can do this using a loop: > > for ( i in 1:length(x) ) { > y <- gsub(x[i],"something else",y) > } > > Surely, there must be a less kludgy way? > > I tried looking at the different apply()s but am not getting anywhere, > partly because I lack the mental flexibility to combine the fact that > I am applying gsub() to y but now want to apply that to x ... erm. :/ > > MarianneYou can use "|" to specify a logical "or" in the search regex:> gsub("one|two", "something else", y)[1] "something else blah" "something else blah" "something else blah" [4] "something else blah" Thus:> paste(x, collapse = "|")[1] "one|two" and finally:> gsub(paste(x, collapse = "|"), "something else", y)[1] "something else blah" "something else blah" "something else blah" [4] "something else blah" See ?regex and ?paste HTH, Marc Schwartz
Christian Raschke
2010-Feb-22 18:20 UTC
[R] gsub patterns from vector elements w/out loop?
Marianne, The function substring2 from the Hmisc packages works nicely for me to do this (without explicit gsub, though): x<- c("one","two") y<- paste(rep(x,2),"blah") y [1] "one blah" "two blah" "one blah" "two blah" substring2(y,x)<- "something else" y [1] "something else blah" "something else blah" "something else blah" "something else blah" Christian On 02/22/2010 10:25 AM, Marianne Promberger wrote:> Dear list, > > I have two vectors: > > x<- c("one","two") > y<- paste(rep(x,2),"blah") > > I want to replace all occurrences of each element of x in y with > something else, so that y looks like this: > > y > [1] "something else blah" "something else blah" "something else blah" > [4] "something else blah" > > I can do this using a loop: > > for ( i in 1:length(x) ) { > y<- gsub(x[i],"something else",y) > } > > Surely, there must be a less kludgy way? > > I tried looking at the different apply()s but am not getting anywhere, > partly because I lack the mental flexibility to combine the fact that > I am applying gsub() to y but now want to apply that to x ... erm. :/ > > Marianne > >-- Christian Raschke Department of Economics and ISDS Research Lab (HSRG) Louisiana State University Patrick Taylor Hall, Rm 2128 Baton Rouge, LA 70803 (225)226-0017 crasch2 at lsu.edu