Skip to content

String position character replacement

8 messages · Yang, Joy (NIH/NHGRI) [F], Jorge I Velez, Sarah Goslee +3 more

#
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
#
And here's an alternative solution:

subchar <- function(string, pos, char="-") {
	for(i in pos) {
   	string <- gsub(paste("^(.{", i-1, "}).", sep=""), "\\1-", string)
	}
	string
}
[1] "he-lohowareyoudoing"
[1] "he-lohow-reyoudoing"
[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:

  
    
#
Thank you both! I was working along the lines of Jorge's method, but was taking longer than it should. Sarah's is actually a lot faster.

Thanks again,
Joy
#
On Wed, Feb 8, 2012 at 12:33 PM, Yang, Joy (NIH/NHGRI) [F]
<joy.yang at nih.gov> wrote:
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:
[1] "he-lohow-reyoudoing" "im--odhowareyou"
#
On Wed, Feb 08, 2012 at 01:30:55PM -0500, Sarah Goslee wrote:
Hi.

Try the following modification.

  subchar2 <- function(string, pos) {
    for(i in pos) {
        substr(string, i, i) <- "-"
    }
    string
  }

  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) subchar2(avec[x], alist[[x]]))

  [1] "he-lohow-reyoudoing"   "im--odhowareyou"       "goo-an-you"           
  [4] "yesi-----ijusttoldyou" "o-ye-t-atsr-ght"      

Hope this helps.

Petr Savicky.
#
Oh cool! I didn't realize you could assign a different value to a substring like that.

Thanks!
Joy