Codezy
Codezy

Reputation: 662

How to replace the certain character in certain position in the string?

I have a question that is how to replace a character which is in a certain place. For example:

str <- c("abcdccc","hijklccc","abcuioccc")
#I want to replace character "c" which is in position 3 to "X" how can I do that?
#I know the function gsub and substr, but the only idea I have got so far is 
#use if() to make it. How can I do it quickly?
#ideal result
>str
"abXdccc" "hijklccc" "abXuioccc"

Upvotes: 5

Views: 3249

Answers (6)

zacdav
zacdav

Reputation: 4671

I wonder if you can use a regex lookahead here to get what you are after.

str <- c("abcdccc","hijklccc","abcuioccc")
gsub("(^.{2})(?=c)(.*$)", "\\1X\\2", str, perl = T)

Or using a positive lookbehind as suggested by thelatemail

sub("(?<=^.{2})c", "X", str, perl = TRUE)

What this is doing is looking to match the letter c which is after any two characters from the start of the string. The c is replaced with X.

(?<= is the start of positive lookbehind

^.{2} means any two characters from the start of the string

)c is the last part which says it has to be a c after the two characters


[1] "abXcdccc"   "hijklccc"   "abXcuioccc"

If you want to read up more about regex being used (link)


Additionally a generalised function:

switch_letter <- function(x, letter, position, replacement) {
  stopifnot(position > 1)

  pattern <- paste0("(?<=^.{", position - 1, "})", letter)

  sub(pattern, replacement, x, perl = TRUE)

}

switch_letter(str, "c", 3, "X")

Upvotes: 2

Sotos
Sotos

Reputation: 51612

You can just use ifelse with gsub, i.e.

ifelse(substr(str, 3, 3) == 'c', paste0(substring(str, 1, 2),'X', substring(str, 4)), str)
#[1] "abXdccc"   "hijklccc"  "abXuioccc"

Upvotes: 1

Alok VS
Alok VS

Reputation: 186

This should work

str <- c("abcdefg","hijklnm","abcuiowre")

for (i in 1:length(str))
{
  if (substr(str[i],3,3)=='c') {
    substr(str[i], 3, 3) <- "X"
  } 
}

Upvotes: 1

HolgerBarlt
HolgerBarlt

Reputation: 317

How about this idea:

c2Xon3 <- function(x){sprintf("%s%s%s",substring(x,1,3),gsub("c","X",substring(x,3,3)),substring(x,4,nchar(x)))}
str <- c("abcdccc","hijklccc","abcuioccc")
strNew <- sapply(str,c2Xon3 )

Upvotes: 1

thelatemail
thelatemail

Reputation: 93938

It's a bit awkward, but you can replace a single character dependent on that single character's value like:

ifelse(substr(str,3,3)=="c", `substr<-`(str,3,3,"X"), str)
#[1] "abXdccc"   "hijklccc"  "abXuioccc"

If you are happy to overwrite the value, you could do it a bit cleaner:

substr(str[substr(str,3,3)=="c"],3,3) <- "X"
str
#[1] "abXdccc"   "hijklccc"  "abXuioccc"

Upvotes: 3

RLave
RLave

Reputation: 8374

This should work too:

str <- c("abcdefg","hijklnm","abcuiowre")
a <- strsplit(str[1], "")[[1]]
a[3] <- "X"
a <- paste(a, collapse = '')
str[1] <- a

Upvotes: 1

Related Questions