Harflerin R sayıları olarak nasıl okunur

Savaş gemisi oyunu kodunda bazı veriler var, bunun gibi: A0, A1, B0, B4, K12 ve bunları koordinat noktalarına dönüştürmek istiyorum. Harf x koordinatı ve y koordinatı sayısı olmalıdır. Bunun yanında, sayıları çarpmak için sayıları harflerle dönüştürmeliyim. Bunun gibi:

A0 = 0 , 0;   
A1 = 0 , 15;   
A2 = 0 , 30; 
B3 = 15 , 45
1
Neden her şey 15 ile çarpılıyor?
katma yazar Adam Birenbaum, kaynak
bu, her nokta arasındaki mesafedir. 15 metre. :)
katma yazar NSano, kaynak

5 cevap

Hadi bakalım:

BattleshipConversion <- function(mystring)
{
  return(c(which(LETTERS==substr(mystring,1,1))-1,as.integer(substr(mystring,2,3)))*15)
}

Sonuç:

>BattleshipConversion("B1") 
15 15
>BattleshipConversion("A10")
0 150

Peki yukarıda neler oluyor?

  • LETTERS is an R pre-generated vector of capital letters. which takes the index position of the letter in that vector, so which(LETTERS=='A') will give 1. We subtract 1 from that.
  • substr is a function that extracts a substring from a string, taking string, start and stop as arguments. counting starts with the first element, which in R is 1. substring(mystring,1,1) takes the first character element of mystring and stops there.
  • as.integer simply converts the 1-2 digit integer stored as character into a proper integer format.
  • we save it all in a combined vector using c(), and everything gets multiplied by 15, per the OP's specification
  • the function returns the result.

Bunun giriş dizginizin doğru biçimlendirildiğini varsaydığını unutmayın. Yalnızca Z ve 99 değerlerine kadar çalışır, yani bir AA14 veya B101 üzerinde başarısız olur. Bazı güvenlik önlemleri eklemek isteyebilirsiniz.

2
katma
B1 15, 15 ve A1 0,150 olmalıdır
katma yazar maRtin, kaynak
@maRtin unutulmuş bir -1 ekledi. Şimdi örneğe göre çalışır.
katma yazar Serban Tanasa, kaynak
ÇOK TEŞEKKÜR EDERİM! : D
katma yazar NSano, kaynak

Bu vektörleştirilmiştir ve kolayca çift harfe uzatılabilir:

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
1
katma

Diyelim ki bu pozisyonlara sahipsin:

pos<-c("A0","A1","A2","B3","K12")

Yapabilirsin:

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   
1
katma
Haklısın. Sabit
katma yazar nicola, kaynak
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
1
katma
@SerbanTanasa düzeltildi, thx
katma yazar maRtin, kaynak
Fikriniz için çok teşekkür ederim :), ama koordinat verilerim harf ve rakamdan oluşan bir dizedir (örnek olarak "A0"), bu yüzden kodunuzu kullanmak için onları ayırmam gerekir. Nasıl yapılacağını biliyor musun?
katma yazar NSano, kaynak

İşte bir dplyr cevap

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)
0
katma
Dene ve neler olacağını gör
katma yazar bramtayl, kaynak
İyi nokta, yukarıda düzeltildi
katma yazar bramtayl, kaynak
LETTERS varsa neden stri_trans_toupper (letters) 'ı kullanmalı? Bu küçük görev için dört paket aşırı görünüyor.
katma yazar Roland, kaynak
rex ne yapar?
katma yazar Serban Tanasa, kaynak
Teşekkürler, bu inanılmaz yardımcı oldu.
katma yazar Serban Tanasa, kaynak