将字母转换为R中的数字

时间:2016-04-09 14:24:20

标签: r

我需要根据美国电话号码逻辑将字母转换为数字,即如果我收到字符串" ADA"我想收到232

的输出

另一个例子 - 输入" TOM-GERRY" ,输出86643779

我试图将字符串和循环分开,但它没有像我预期的那样工作,我该如何改进呢?

QWE<-function(s){
  k<-c((unlist(strsplit(s, ""))))
  p<-0
  phone<-as.numeric(...)
  for(i in 1:length(k))
  if (i=="A-C") 
    p<-2
else if (i=="D-F")
    p<-3
else  if (i=="G-I") 
    p<-4
    else if (i=="J-L") 
    p<-5
    else if (i=="M-O") 
  p<-6
  else if (i=="P-S") 
  p<-7
  else if (i=="T-V")
  p<-8
  else if (i=="W-Z") 
  p<-9
    phone <- append(phone, p)
  }
return(phone)

2 个答案:

答案 0 :(得分:1)

setNames(rep(2:9, c(3,3,3,3,3,4,3,4)), LETTERS)[strsplit('TOMGERRY', '')[[1]]]
# T O M G E R R Y 
# 8 6 6 4 3 7 7 9 

您可以在一行中执行此操作,但这是我用于许多重新编码任务的非常通用的方法。

从您的文字开始,删除所有不是A-Z的内容,并将字符串拆分为单独的字母。

(x <- gsub('[^A-Z]', '', 'TOM-GERRY'))
# [1] "TOMGERRY"

(y <- strsplit(x, '')[[1]])
# [1] "T" "O" "M" "G" "E" "R" "R" "Y"

接下来设置一个键。就像我说的,这可能非常通用,您可以将多个值映射到单个或多个值,就像我们在这里一样。

(key <- setNames(rep(2:9, c(3,3,3,3,3,4,3,4)), LETTERS))
# 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 
# 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 7 8 8 8 9 9 9 9 

并应用密钥(如果需要,还可以unname

key[y]
# T O M G E R R Y 
# 8 6 6 4 3 7 7 9 

unname(key[y])
# [1] 8 6 6 4 3 7 7 9

paste(key[y], collapse = '')
# [1] "86643779"

你可以把它包装成一个函数来使它更有用

f <- function(..., names = TRUE, collapse = TRUE) {
  unname <- if (!names) unname else identity
  collapse <- if (collapse) function(x) paste(x, collapse = '') else identity
  y <- strsplit(gsub('[^A-Z]', '', c(...), ignore.case = TRUE), '')
  key <- setNames(rep(2:9, c(3,3,3,3,3,4,3,4)), LETTERS)
  lapply(y, function(x) collapse(unname(key[toupper(x)])))
}

f('TOM-GERRY', 'tomgerry', '(tom) and-gerry')
# [[1]]
# [1] "86643779"
# 
# [[2]]
# [1] "86643779"
# 
# [[3]]
# [1] "86626343779"

f('TOM-GERRY', 'tomgerry', '(tom) and-gerry', collapse = FALSE)
# [[1]]
# T O M G E R R Y 
# 8 6 6 4 3 7 7 9 
# 
# [[2]]
# T O M G E R R Y 
# 8 6 6 4 3 7 7 9 
# 
# [[3]]
# T O M A N D G E R R Y 
# 8 6 6 2 6 3 4 3 7 7 9 

答案 1 :(得分:0)

最简单的方法是在plyr包中使用mapValues()。你应该能够在一个阶段创建2个变量,而另一个阶段创建相应的stage_number,并直接将它们解析为函数。

mapvalues(str, from = c("beta", "gamma"), to = c("two", "three"))