我有一个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,可以是任何数字.
您可以使用 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)