r - Replace characters in a column, based on a translation table from another data frame -


i have data.frame mapping contains path , map. have data.frame data contains raw path , value. edit: path might have 2 components or more: e.g. "a>c" or "a>c>b"

set.seed(24); data <- data.frame(             path=paste0(sample(letters[1:3], 25, replace=true), ">", sample(letters[1:3], 25, replace=true)),             value=rnorm(25)         ) mapping <- data.frame(path=c("a","b","c"), map=c("x","y","z"))  lapply(mapping, function (x) {   (i in 1:nrow(data)) {     data$path[i] <- gsub(as.character(x["path"]),as.character(x["map"]),as.character(data$path[i]))       } }) 

i'm trying replace path in data map value in mapping doesn't seem working me.

"a>c" converted "x>z".

i understand loops not in r, can't think of way code it. data size i'm working 6m row in data , 16k rows in mapping.

clarification on data: while path consists of alphabets (abc) now, real path domain names. number of steps in path not fixed @ 2 , can number.

you can use chartr

  data$path <- chartr('abc', 'xyz', data$path) 

or if using data 'mapping'

  data$path <- chartr(paste(mapping$path, collapse=''),                      paste(mapping$map, collapse=''), data$path) 

or using gsubfn

  library(gsubfn)   pat <- paste0('[', paste(mapping$path, collapse=''),']')   indx <- setnames(as.character(mapping$map), mapping$path)   gsubfn(pat, as.list(indx), as.character(data$path)) 

or base r option based on @smci's comment

  vapply(strsplit(as.character(data$path), '>'), function(x)                   paste(indx[x], collapse=">"), character(1l)) 

Comments