根据另一个数据框中的转换表替换列中的字符

iuk*_*kie 1 replace r

我有一个data.frame mapping包含路径和地图.我还有另一个data.frame DATA包含原始路径和值的.编辑:路径可能有两个或更多组件:例如"A> C"或"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) {
  for (i in 1:nrow(DATA)) {
    DATA$path[i] <- gsub(as.character(x["path"]),as.character(x["map"]),as.character(DATA$path[i]))    
  }
})
Run Code Online (Sandbox Code Playgroud)

我正在尝试DATA用地图值替换路径,mapping但这对我来说似乎不起作用.

"A> C"将转换为"X> Z".

我知道for循环并不好R,但我想不出另一种编码方式.我正在使用的数据大小是6米行DATA和16行行mapping.

对数据的澄清:虽然路径现在由字母(ABC)组成,但实际路径实际上是域名.路径中的步数也不固定为2,可以是任何数字.

akr*_*run 5

您可以使用 chartr

  DATA$path <- chartr('ABC', 'XYZ', DATA$path)
Run Code Online (Sandbox Code Playgroud)

或者如果我们使用'mapping'中的数据

  DATA$path <- chartr(paste(mapping$path, collapse=''), 
                    paste(mapping$map, collapse=''), DATA$path)
Run Code Online (Sandbox Code Playgroud)

或使用 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))
Run Code Online (Sandbox Code Playgroud)

或者base R基于@ smci评论的选项

  vapply(strsplit(as.character(DATA$path), '>'), function(x) 
                 paste(indx[x], collapse=">"), character(1L))
Run Code Online (Sandbox Code Playgroud)