2014-12-26 4 views
3

Я бы хотел рассчитать имя для набора заданных имен.Рассчитать номер имени

Номер имени рассчитывается путем суммирования значения, присвоенного каждому алфавиту. Значения приведены ниже:

a=i=j=q=y=1 
b=k=r=2 
c=g=l=s=3 
d=m=t=4 
h=e=n=x=5 
u=v=w=6 
o=z=7 
p=f=8 

Пример: Название Номер Давида может быть вычислено следующим образом:

D+a+v+i+d 
4+1+6+1+4 
16=1+6=7 

Имя количество Давида 7.

Я хотел бы написать функцию в R для этого. Я благодарен за любые указания или советы или предложения пакетов, которые я должен изучить.

+2

У вас есть вопрос? Stackoverflow - это вопрос и ответ. –

+0

Отредактировал мой вопрос. Надеюсь, теперь все в порядке. Извините, это мой первый пост здесь. –

+0

Кажется, что это рекурсивный процесс для сопоставления числа в диапазоне [1,9] – Dason

ответ

5

Я уверен, что есть несколько способов сделать это, но вот подход с использованием имени вектора:

x <- c(
    "a"=1,"i"=1,"j"=1,"q"=1,"y"=1, 
    "b"=2,"k"=2,"r"=2, 
    "c"=3,"g"=3,"l"=3,"s"=3, 
    "d"=4,"m"=4,"t"=4, 
    "h"=5,"e"=5,"n"=5,"x"=5, 
    "u"=6,"v"=6,"w"=6, 
    "o"=7,"z"=7, 
    "p"=8,"f"=8) 
## 
name_val <- function(Name, mapping=x){ 
    split <- tolower(unlist(strsplit(Name,""))) 
    total <-sum(mapping[split]) 
    ## 
    sum(as.numeric(unlist(strsplit(as.character(total),split="")))) 
} 
## 
Names <- c("David","Betty","joe") 
## 
R> name_val("David") 
[1] 7 
R> sapply(Names,name_val) 
David Betty joe 
    7  7  4 
+0

Кто-то действительно понизил это? – nrussell

+0

Кто-то остановил их всех. Надеюсь, они отправят отличный ответ. –

+0

@RichardScriven. Я думаю, что Санта оставил им кусок угля вчера, и они отнимают наши разочарования. – nrussell

6

Вы хотите создать вектор значений, в алфавитном порядке, а затем использовать match для получить свои индексы. Что-то вроде этого:

a <- i <- j <- q <- y <- 1 
b <- k <- r <- 2 
c <- g <- l <- s <- 3 
d <- m <- t <- 4 
h <- e <- n <- x <- 5 
u <- v <- w <- 6 
o <- z <- 7 
p <- f <- 8 

vals <- c(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) 
sum(vals[match(c("d","a","v","i","d"), letters)]) 
10

Этот фрагмент кода будет выполнять то, что вы хотите:

# Name for which the number should be computed. 
name <- "David" 

# Prepare letter scores array. In this case, the score for each letter will be the array position of the string it occurs in. 
val <- c("aijqy", "bkr", "cgls", "dmt", "henx", "uvw", "oz", "pf") 

# Convert name to lowercase. 
lName <- tolower(name)    

# Compute the sum of letter scores. 
s <- sum(sapply(unlist(strsplit(lName,"")), function(x) grep(x, val))) 

# Compute the "number" for the sum of letter scores. This is a recursive operation, which can be shortened to taking the mod by 9, with a small correction in case the sum is 9. 
n <- (s %% 9) 
n <- ifelse(n==0, 9, n) 

«п» является результат, который вы хотите для любого «имя»

Смежные вопросы