Hi, Is there a way to efficiently replace specified indices in a string with another character? For example, if I had a vector of strings such as [1] "hellohowareyoudoing" [2] "imgoodhowareyou" [3] "goodandyou" [4] "yesimgoodijusttoldyou" [5] "ohyesthatsright" and had a list of positions that I want to replace with the character "-" [[1]] [1] 3 9 [[2]] [1] 3 4 [[3]] [1] 4 7 [[4]] [1] 5 6 7 8 9 [[5]] [1] 2 5 7 12 I would like to get [1] "he-lohow-reyoudoing" [2] "im--odhowareyou" [3] "goo-an-you" [4] "yesi-----ijusttoldyou" [5] "o-ye-t-atsr-ght" Is there an easy way to do this? Or would the easiest way be writing a function to take substrings of the original vector and pasting in the replacement character? Thanks in advance! Joy
Hi Joy, Perhaps not the easiest way, but the following seems to work: x <- c("hellohowareyoudoing", "imgoodhowareyou", "goodandyou", "yesimgoodijusttoldyou", "ohyesthatsright") pos <- list(c(3, 9), c(3,4), c(4,7), 5:9, c(2, 5, 7, 12)) sapply(1:length(pos), function(i){ xx <- strsplit(x, "")[[i]] xx[pos[[i]]] <- "-" paste(xx, sep = "", collapse = "") }) [1] "he-lohow-reyoudoing" "im--odhowareyou" "goo-an-you" [4] "yesi-----ijusttoldyou" "o-ye-t-atsr-ght" On Wed, Feb 8, 2012 at 12:33 PM, Yang, Joy (NIH/NHGRI) [F] <> wrote:> Hi, > > Is there a way to efficiently replace specified indices in a string with > another character? For example, if I had a vector of strings such as > > [1] "hellohowareyoudoing" > [2] "imgoodhowareyou" > [3] "goodandyou" > [4] "yesimgoodijusttoldyou" > [5] "ohyesthatsright" > > and had a list of positions that I want to replace with the character "-" > > [[1]] > [1] 3 9 > > [[2]] > [1] 3 4 > > [[3]] > [1] 4 7 > > [[4]] > [1] 5 6 7 8 9 > > [[5]] > [1] 2 5 7 12 > > I would like to get > > [1] "he-lohow-reyoudoing" > [2] "im--odhowareyou" > [3] "goo-an-you" > [4] "yesi-----ijusttoldyou" > [5] "o-ye-t-atsr-ght" > > Is there an easy way to do this? Or would the easiest way be writing a > function to take substrings of the original vector and pasting in the > replacement character? > > Thanks in advance! > Joy > ______________________________________________ > R-help@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. >[[alternative HTML version deleted]]
And here's an alternative solution: subchar <- function(string, pos, char="-") { for(i in pos) { string <- gsub(paste("^(.{", i-1, "}).", sep=""), "\\1-", string) } string }> subchar("hellohowareyoudoing", 3)[1] "he-lohowareyoudoing"> subchar("hellohowareyoudoing", c(3, 9))[1] "he-lohow-reyoudoing"> avec <- c("hellohowareyoudoing", "imgoodhowareyou", "goodandyou", "yesimgoodijusttoldyou", "ohyesthatsright") > alist <- list(c(3, 9), c(3, 4), c(4, 7), c(5,6,7,8,9), c(2,5,7,12))> sapply(1:length(avec), function(x)subchar(avec[x], alist[[x]]))[1] "he-lohow-reyoudoing" "im--odhowareyou" "goo-an-you" [4] "yesi-----ijusttoldyou" "o-ye-t-atsr-ght">Sarah On Wed, Feb 8, 2012 at 12:33 PM, Yang, Joy (NIH/NHGRI) [F] <joy.yang at nih.gov> wrote:> Hi, > > Is there a way to efficiently replace specified indices in a string with another character? For example, if I had a vector of strings such as > > [1] "hellohowareyoudoing" > [2] "imgoodhowareyou" > [3] "goodandyou" > [4] "yesimgoodijusttoldyou" > [5] "ohyesthatsright" > > and had a list of positions that I want to replace with the character "-" > > [[1]] > [1] ?3 ?9 > > [[2]] > [1] ?3 ?4 > > [[3]] > [1] ?4 ?7 > > [[4]] > [1] 5 6 7 8 9 > > [[5]] > [1] ?2 ?5 ?7 12 > > I would like to get > > [1] "he-lohow-reyoudoing" > [2] "im--odhowareyou" > [3] "goo-an-you" > [4] "yesi-----ijusttoldyou" > [5] "o-ye-t-atsr-ght" > > Is there an easy way to do this? Or would the easiest way be writing a function to take substrings of the original vector and pasting in the replacement character? > > Thanks in advance! > Joy-- Sarah Goslee http://www.functionaldiversity.org
On Wed, Feb 8, 2012 at 12:33 PM, Yang, Joy (NIH/NHGRI) [F] <joy.yang at nih.gov> wrote:> Hi, > > Is there a way to efficiently replace specified indices in a string with another character? For example, if I had a vector of strings such as > > [1] "hellohowareyoudoing" > [2] "imgoodhowareyou" > [3] "goodandyou" > [4] "yesimgoodijusttoldyou" > [5] "ohyesthatsright" > > and had a list of positions that I want to replace with the character "-" > > [[1]] > [1] ?3 ?9 > > [[2]] > [1] ?3 ?4 > > [[3]] > [1] ?4 ?7 > > [[4]] > [1] 5 6 7 8 9 > > [[5]] > [1] ?2 ?5 ?7 12 > > I would like to get > > [1] "he-lohow-reyoudoing" > [2] "im--odhowareyou" > [3] "goo-an-you" > [4] "yesi-----ijusttoldyou" > [5] "o-ye-t-atsr-ght" > > Is there an easy way to do this? Or would the easiest way be writing a function to take substrings of the original vector and pasting in the replacement character? >Using this input: pos <- list(c(3, 9), c(3, 4)) s <- c("hellohowareyoudoing", "imgoodhowareyou") we can use regmatches like this where the lapply on the LHS constructs a matches list and the lapply on the RHS constructs a list of "-" characters: f <- function(p) structure(p, match.length = rep(1, length(p))) regmatches(s, lapply(pos, f)) <- lapply(pos, function(p) "-") The resulting s is:> s[1] "he-lohow-reyoudoing" "im--odhowareyou" -- Statistics & Software Consulting GKX Group, GKX Associates Inc. tel: 1-877-GKX-GROUP email: ggrothendieck at gmail.com
Try this: sapply(mapply(replace, x = strsplit(avec, NULL), list = alist, MoreArgs list(values = "-")), paste, collapse = "") On Wed, Feb 8, 2012 at 3:33 PM, Yang, Joy (NIH/NHGRI) [F] <joy.yang@nih.gov>wrote:> Hi, > > Is there a way to efficiently replace specified indices in a string with > another character? For example, if I had a vector of strings such as > > [1] "hellohowareyoudoing" > [2] "imgoodhowareyou" > [3] "goodandyou" > [4] "yesimgoodijusttoldyou" > [5] "ohyesthatsright" > > and had a list of positions that I want to replace with the character "-" > > [[1]] > [1] 3 9 > > [[2]] > [1] 3 4 > > [[3]] > [1] 4 7 > > [[4]] > [1] 5 6 7 8 9 > > [[5]] > [1] 2 5 7 12 > > I would like to get > > [1] "he-lohow-reyoudoing" > [2] "im--odhowareyou" > [3] "goo-an-you" > [4] "yesi-----ijusttoldyou" > [5] "o-ye-t-atsr-ght" > > Is there an easy way to do this? Or would the easiest way be writing a > function to take substrings of the original vector and pasting in the > replacement character? > > Thanks in advance! > Joy > ______________________________________________ > R-help@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. >-- Henrique Dallazuanna Curitiba-Paraná-Brasil 25° 25' 40" S 49° 16' 22" O [[alternative HTML version deleted]]