Guilherme D. Garcia
Guilherme D. Garcia

Reputation: 179

Replacement with vectors

I have a vector with all consonants and I want every single consonant to be replaced with a "C" in a given data frame. Assume my data frame is x below:

   x <- c("abacate", "papel", "importante")

    v <- c("a", "e", "i", "o", "u")
    c <- c("b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y",     "z")

    find    <- c
    replace <- "C"
    found   <- match(x, find)

    ifelse(is.na(found), x, replace[found])

This is not working. Could anybody tell me what the problem is and how I can fix it?

Thanks

Upvotes: 3

Views: 80

Answers (2)

flodel
flodel

Reputation: 89097

Regular expressions (gsub) are far more flexible in general, but for that particular problem you can also use the chartr function which will run faster:

old <- c("b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n",
         "p", "q", "r", "s", "t", "v", "w", "x", "y", "z")
new <- rep("C", length(old))
chartr(paste(old, collapse = ""),
       paste(new, collapse = ""), x)

Upvotes: 2

David Robinson
David Robinson

Reputation: 78640

Use gsub to replace the letters in a character vector:

c <- c("b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y",     "z")
consonants = paste(c("[", c, "]"), collapse="")
replaced = gsub(consonants, "C", x)

consonants becomes a regular expression, [bcdfghjklmnpqrstvwxyz], that means "any letter inside the brackets."

One of the reasons your code wasn't working is that match doesn't look for strings within other strings, it only looks for exact matches. For example:

> match(c("a", "b"), "a")
[1]  1 NA
> match(c("a", "b"), "apple")
[1] NA NA

Upvotes: 2

Related Questions