我已经尝试了几个小时来找到解决方案,我认为这是一件容易的事,但我失败了。
我有一个由3个不同字符('I','R' & 'O')
组成的字符串,长度从1到6
E.g
IRRROO
RRORRR
IIR
RIRRO
每个字符代表一个数字I=1,R=2,O=3
我需要将此字符串转换为单个数字,与位置相乘并对结果求和。 E.g
IRRROO ---> (1*1)+(2*2)+(2*3)+(2*4)+(3*5)+(3*6) =52
IIR ---> (1*1)+(1*2)+(2*3) =9
提前感谢您的帮助。
答案 0 :(得分: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
答案 1 :(得分: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