首页 > 解决方案 > 优化此 for 循环(字母到数字)功能的最佳方法是什么?

问题描述

我有一个干净的字母输入流,我想将其转换为从 1 到 27 的数字向量(所有字母包括空格)。我无法想象嵌套的 for 循环是做到这一点的最佳方式。没有循环可以吗?

space_letters = append(letters, " ")

text_to_numbers = function (input_stream) {

  input_stream = unlist(strsplit(input_stream, split = ""))

  for(i in 1:length(input_stream)) {
    for(j in 1:length(space_letters) {
      if(input_stream[i] == space_letters[j]) {
        input_stream[i] = j
      }
    }
  }
  return(as.integer(input_stream))
}

标签: rfor-loopoptimizationletter

解决方案


这是使用的基本 R 替代方案match

text_to_numbers <- function(ss)
    as.numeric(sapply(strsplit(ss, ""), function(x) match(x, c(letters, " "))))

text_to_numbers("abcdef")
#[1] 1 2 3 4 5 6

text_to_numbers("the cat")
#[1] 20  8  5 27  3  1 20

purrr/stringr等价物:

library(tidyverse)
text_to_numbers <- function(ss)
    map_int(str_split(ss, "", simplify = T), ~match(.x, c(letters, " ")))

推荐阅读