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
String position character replacement
8 messages · Yang, Joy (NIH/NHGRI) [F], Jorge I Velez, Sarah Goslee +3 more
An embedded and charset-unspecified text was scrubbed... Name: not available URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20120208/e230e4d5/attachment.pl>
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
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
From: Sarah Goslee [sarah.goslee at gmail.com]
Sent: Wednesday, February 08, 2012 1:30 PM
To: Yang, Joy (NIH/NHGRI) [F]
Cc: r-help at R-project.org
Subject: Re: [R] String position character replacement
Sent: Wednesday, February 08, 2012 1:30 PM
To: Yang, Joy (NIH/NHGRI) [F]
Cc: r-help at R-project.org
Subject: Re: [R] String position character replacement
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
On Wed, Feb 08, 2012 at 01:30:55PM -0500, Sarah Goslee wrote:
And here's an alternative solution:
subchar <- function(string, pos, char="-") {
for(i in pos) {
string <- gsub(paste("^(.{", i-1, "}).", sep=""), "\\1-", string)
}
string
}
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
From: Petr Savicky [savicky at cs.cas.cz]
Sent: Wednesday, February 08, 2012 3:26 PM
To: r-help at r-project.org
Subject: Re: [R] String position character replacement
Sent: Wednesday, February 08, 2012 3:26 PM
To: r-help at r-project.org
Subject: Re: [R] String position character replacement
On Wed, Feb 08, 2012 at 01:30:55PM -0500, Sarah Goslee wrote:
> And here's an alternative solution:
>
> subchar <- function(string, pos, char="-") {
> for(i in pos) {
> string <- gsub(paste("^(.{", i-1, "}).", sep=""), "\\1-", string)
> }
> string
> }
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.
______________________________________________
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.
An embedded and charset-unspecified text was scrubbed... Name: not available URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20120208/b53f11a5/attachment.pl>