r - 优化此 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))
}
解决方案
这是使用的基本 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, " ")))
推荐阅读
- xpath - Scrapy如何在for循环中使用xpaths
- nsis - NSIS错误安装位置
- javascript - Angular ajax 文件上传未捕获 500 HTTP 响应
- java - 有没有一种方法可以使用 for 循环来对具有与之关联的字符串的整数求和?
- c# - 如何在 C# (dotnetcore) 中获取套接字的文件号/文件句柄
- python - Tkinter 列表框进行选择
- robotics - Minibrick8 不通过 RS-232 串行电缆连接到计算机,当有一个快动开关(微动开关)连接时
- azure - .NET Core 3.0 中的 Azure 应用服务日志流 - 看不到任何日志
- auth0 - 同一个 React 应用中的多个 Auth0 SDK
- python - 'list' 对象没有属性 'matmul'