我需要根据美国电话号码逻辑将字母转换为数字,即如果我收到字符串" 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)
答案 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"))