如何在 R 中将字母读作数字
how to read letters as numbers in R
我有一些数据在代码中作为战舰游戏,如下所示:A0,A1,B0,B4,K12
我想将这些数据转换为坐标点。字母应该是 x 坐标,数字是 y 坐标。除此之外,我应该将字母转换为数字以将它们相乘。像这样:
A0 = 0 , 0;
A1 = 0 , 15;
A2 = 0 , 30;
B3 = 15 , 45
BSconverter <- function(str){
let <- substr(str,1,1)
num <- as.integer(substr(str,2,nchar(str))) * 15
letnum <- (which(LETTERS==let)-1) * 15
c(letnum, num)
}
> BSconverter("K12")
[1] 150 180
假设您有这些职位:
pos<-c("A0","A1","A2","B3","K12")
您可以:
require(data.table) #just to use tstrsplit
res<-setNames(as.data.frame(tstrsplit(pos,"(?<=[A-Z])",perl=TRUE),stringsAsFactors=FALSE),c("x","y"))
res[[1]]<-(match(res[[1]],LETTERS)-1)*15
res[[2]]<-as.numeric(res[[2]])*15
cbind(pos,res)
# pos x y
#1 A0 0 0
#2 A1 0 15
#3 A2 0 30
#4 B3 15 45
#5 K12 150 180
给你:
BattleshipConversion <- function(mystring)
{
return(c(which(LETTERS==substr(mystring,1,1))-1,as.integer(substr(mystring,2,3)))*15)
}
结果:
>BattleshipConversion("B1")
15 15
>BattleshipConversion("A10")
0 150
那么上面发生了什么?
LETTERS
是 R 预生成的大写字母向量。 which
获取该向量中字母的索引位置,因此 which(LETTERS=='A')
将给出 1。我们从中减去 1。
substr
是一个从字符串中提取子串的函数,参数为string
、start
和stop
。计数从第一个元素开始,在 R 中是 1。substring(mystring,1,1)
取 mystring 的第一个字符元素并在那里停止。
as.integer
简单地将存储为字符的1-2位整数转换为适当的整数格式。
- 我们使用
c()
将其全部保存在一个组合向量中,并且根据 OP 的规范,所有内容都乘以 15
- 函数returns结果。
请注意,这假设您的输入字符串格式正确。它只会工作到 Z
和 99
,即会在 AA14
或 B101
时失败。您可能需要添加一些保护措施。
这是矢量化的,可以轻松扩展为双字母:
fun <- function(s) {
x <- gsub("[[:digit:]]", "", s) #remove numbers
y <- gsub("[[:alpha:]]", "", s) #remove letters
x <- match(x, LETTERS) - 1 #match against letters
y <- as.integer(y)
cbind(x = x * 15, y = y * 15)
}
fun(c("A0", "A1", "A2", "B3"))
# x y
#[1,] 0 0
#[2,] 0 15
#[3,] 0 30
#[4,] 15 45
这是一个 dplyr 答案
library(dplyr)
library(tidyr)
library(rex)
template = rex(capture(letters),
capture(numbers) )
coordinates = c("A0","A1","B0","B4","K12")
letter_frame =
data_frame(LETTERS,
x_small = 1:26)
result =
data_frame(coordinate = coordinates) %>%
extract(coordinate, c("letter", "y_small"), template, convert = TRUE) %>%
left_join(letter_frame) %>%
mutate(x = x_small*15,
y = y_small*15)
我有一些数据在代码中作为战舰游戏,如下所示:A0,A1,B0,B4,K12
我想将这些数据转换为坐标点。字母应该是 x 坐标,数字是 y 坐标。除此之外,我应该将字母转换为数字以将它们相乘。像这样:
A0 = 0 , 0;
A1 = 0 , 15;
A2 = 0 , 30;
B3 = 15 , 45
BSconverter <- function(str){
let <- substr(str,1,1)
num <- as.integer(substr(str,2,nchar(str))) * 15
letnum <- (which(LETTERS==let)-1) * 15
c(letnum, num)
}
> BSconverter("K12")
[1] 150 180
假设您有这些职位:
pos<-c("A0","A1","A2","B3","K12")
您可以:
require(data.table) #just to use tstrsplit
res<-setNames(as.data.frame(tstrsplit(pos,"(?<=[A-Z])",perl=TRUE),stringsAsFactors=FALSE),c("x","y"))
res[[1]]<-(match(res[[1]],LETTERS)-1)*15
res[[2]]<-as.numeric(res[[2]])*15
cbind(pos,res)
# pos x y
#1 A0 0 0
#2 A1 0 15
#3 A2 0 30
#4 B3 15 45
#5 K12 150 180
给你:
BattleshipConversion <- function(mystring)
{
return(c(which(LETTERS==substr(mystring,1,1))-1,as.integer(substr(mystring,2,3)))*15)
}
结果:
>BattleshipConversion("B1")
15 15
>BattleshipConversion("A10")
0 150
那么上面发生了什么?
LETTERS
是 R 预生成的大写字母向量。which
获取该向量中字母的索引位置,因此which(LETTERS=='A')
将给出 1。我们从中减去 1。substr
是一个从字符串中提取子串的函数,参数为string
、start
和stop
。计数从第一个元素开始,在 R 中是 1。substring(mystring,1,1)
取 mystring 的第一个字符元素并在那里停止。as.integer
简单地将存储为字符的1-2位整数转换为适当的整数格式。- 我们使用
c()
将其全部保存在一个组合向量中,并且根据 OP 的规范,所有内容都乘以 15 - 函数returns结果。
请注意,这假设您的输入字符串格式正确。它只会工作到 Z
和 99
,即会在 AA14
或 B101
时失败。您可能需要添加一些保护措施。
这是矢量化的,可以轻松扩展为双字母:
fun <- function(s) {
x <- gsub("[[:digit:]]", "", s) #remove numbers
y <- gsub("[[:alpha:]]", "", s) #remove letters
x <- match(x, LETTERS) - 1 #match against letters
y <- as.integer(y)
cbind(x = x * 15, y = y * 15)
}
fun(c("A0", "A1", "A2", "B3"))
# x y
#[1,] 0 0
#[2,] 0 15
#[3,] 0 30
#[4,] 15 45
这是一个 dplyr 答案
library(dplyr)
library(tidyr)
library(rex)
template = rex(capture(letters),
capture(numbers) )
coordinates = c("A0","A1","B0","B4","K12")
letter_frame =
data_frame(LETTERS,
x_small = 1:26)
result =
data_frame(coordinate = coordinates) %>%
extract(coordinate, c("letter", "y_small"), template, convert = TRUE) %>%
left_join(letter_frame) %>%
mutate(x = x_small*15,
y = y_small*15)