首页 文章

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

提问于
浏览
8

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

我有一个由3个不同字符组成的字符串 ('I','R' & 'O') ,长度从1到6 .
例如

IRRROO
RRORRR
IIR
RIRRO

每个字符代表一个数字 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

在此先感谢您的帮助 .

2 回答

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

    或作为一个不错的单行函数:

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

相关问题