R harfidagi harflar sifatida qanday o'qiladi

Ushbu kodda quyidagi kodlardagi ma'lumotlar mavjud: A0, A1, B0, B4, K12 va ularni koordinatalar nuqtasiga aylantirmoqchiman. X-koordinat va y-koordinatasi bo'lishi kerak. Bundan tashqari, harflarni ko'paytirishi uchun raqamlarni aylantiraman. Shunga o'xshash:

A0 = 0 , 0;   
A1 = 0 , 15;   
A2 = 0 , 30; 
B3 = 15 , 45
1
Nima uchun hamma narsa 15 ga ko'paytiriladi?
qo'shib qo'ydi muallif Adam Birenbaum, manba
Bu har bir nuqta orasidagi masofa. 15 metr. :)
qo'shib qo'ydi muallif NSano, manba

5 javoblar

Mana:

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

Natija:

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

Xo'sh, yuqorida nima yuz beradi?

  • 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.

Bu kirish satrini to'g'ri formatlashtirilganligini ta'kidlashni unutmang. Faqat Z va 99 ga ishlaydi, ya'ni AA14 yoki B101 ustida ishlamaydi. Ba'zi kafolatlarga qo'shimcha kiritish mumkin.

2
qo'shib qo'ydi
B1 15, 15 va A1 0,150 bo'lishi kerak
qo'shib qo'ydi muallif maRtin, manba
@maRtin unutgan -1 ni qo'shdi. Hozirgi misolga ko'ra ishlaydi.
qo'shib qo'ydi muallif Serban Tanasa, manba
SIZGA KATTA RAHMAT! : D
qo'shib qo'ydi muallif NSano, manba

Bu vektorlashtiriladi va osongina ikki harfga uzatilishi mumkin:

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
qo'shib qo'ydi

Sizda shunday pozitsiyalar mavjud:

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

Siz .. qila olasiz; siz ... mumkin:

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
qo'shib qo'ydi
Siz haqsiz. Ruxsat etilgan
qo'shib qo'ydi muallif nicola, manba
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
qo'shib qo'ydi
@SerbanTanasa sobit, thx
qo'shib qo'ydi muallif maRtin, manba
Sizning g'oyangiz uchun juda minnatdormiz :), lekin mening koordinatalarim harflar va raqamlar ("A0", misol sifatida) tomonidan yaratilgan mag'lubiyatdir, shuning uchun ularni kodingizni ishlatish uchun ajratish kerak. Buni qanday qilishni bilasizmi?
qo'shib qo'ydi muallif NSano, manba

Mana bir javob

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
qo'shib qo'ydi
Ushlab ko'ring va nima sodir bo'lganini ko'ring
qo'shib qo'ydi muallif bramtayl, manba
Yaxshi nuqta, yuqorida qayd etilgan
qo'shib qo'ydi muallif bramtayl, manba
Letterlar bo'lsa, nima uchun stri_trans_toupper (letters) dan foydalaniladi? To'rt paket bu kichik vazifa uchun haddan ziyod tuyuladi.
qo'shib qo'ydi muallif Roland, manba
rex nima qiladi?
qo'shib qo'ydi muallif Serban Tanasa, manba
Rahmat, bu juda foydali.
qo'shib qo'ydi muallif Serban Tanasa, manba