将字符串转换为单个数字和总和

Pan*_*al. 9 recursion text r sum character

我已经尝试了几个小时来找到解决方案,我认为这是一项简单的任务,但我失败了.

我具有由3个不同的字符的字符串('I','R' & 'O'),长度从1至6
例如

IRRROO
RRORRR
IIR
RIRRO
Run Code Online (Sandbox Code Playgroud)

每个字符代表I=1,R=2,O=3
我需要将此字符串转换为单个数字,与位置相乘并将结果相加的数字.例如

IRRROO ---> (1*1)+(2*2)+(2*3)+(2*4)+(3*5)+(3*6) =52
IIR    ---> (1*1)+(1*2)+(2*3) =9
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助.

Ric*_*rta 11

因素有数字等价物.您可以很好地利用这个例子:

# original
x1 <- "IRRROO"

         # 1    2    3
levs <- c("I", "R", "O")

# split the string and convert to factors, then to numeric
x1f <- as.numeric(factor(strsplit(x1, "")[[1]], levels=levs))

# tally it up 
sum(x1f * seq_along(x1f))
Run Code Online (Sandbox Code Playgroud)

或者作为一个很好的单行函数:

sumValue <- function(x, levs=c("I", "R", "O")) 
    sum(seq.int(nchar(x)) *  as.numeric(factor(strsplit(x, "")[[1]], levels=levs)))

sumValue("IRRROO")
# [1] 52
sumValue("IIR")
# [1] 9
Run Code Online (Sandbox Code Playgroud)

  • @thelatemail,当然不是.在这种情况下,您需要虚拟因子级别,或者您只需使用字典索引,如您的答案;) (2认同)

the*_*ail 7

使用命名向量作为输入的替代版本,允许为每个字母分配任意数值:

vals <- c(I=1,R=2,O=3)
test <- c("IRRROO","RRORRR","IIR","RIRRO")

sumValue <- function(dat,vals) {
  tmp <- strsplit(dat,"")
  vapply(tmp,function(x) sum(seq_along(x) * vals[x]),numeric(1))
}

sumValue(test,vals)
[1] 52 45  9 33
Run Code Online (Sandbox Code Playgroud)

  • 用`vapply(..,0)替换`sapply(...)`可以显着提高速度. (3认同)