该论点的要点如下:

我编写的函数考虑了一个参数,一个字母数字字符串,应该输出一个字符串,在该字符串中,此字母数字字符串的每个元素的值都进行了一些“映射”操作。 MRE如下:

#This is the original and switches value map
map = data.table(mapped = c(0:35), original = c(0:9,LETTERS))
#the function that I'm using:
as_numbers <- function(string) {
  #split string unlisted
  vector_unlisted <- unlist(strsplit(string,""))
  #match the string in vector
  for (i in 1:length(vector_unlisted)) {

    vector_unlisted[i] <- subset(map, map$original==vector_unlisted[i])[[1]][1]

  }
  vector_unlisted <- paste0(vector_unlisted, collapse = "")

  return(vector_unlisted)
}


我正在尝试从for loop移开,以提高性能,因为该函数可以正常工作,但是对于以这种形式提供的元素数量来说,它的速度相当慢:

unlist(lapply(dat$alphanum, function(x) as_numbers(x)))


输入字符串的示例为:549300JV8KEETQJYUG13。这应该导致像5493001931820141429261934301613这样的字符串

在这种情况下,仅提供一个字符串:

> as_numbers("549300JV8KEETQJYUG13")
[1] "5493001931820141429261934301613"

最佳答案

使用Reducegsub,您可以定义以下函数

replacer <- function(x) Reduce(function(x,r) gsub(map$original[r],
             map$mapped[r], x, fixed=T), seq_len(nrow(map)),x)


# Let's test it
replacer("549300JV8KEETQJYUG13")
#[1] "5493001931820141429261934301613"

关于r - 通过远离for循环来提高性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35579650/

10-12 17:25