9

簡単な作業だと思っていた問題の解決策を見つけるために何時間も試みましたが、失敗しました。

('I','R' & 'O')長さが 1 から 6の 3 つの異なる文字で構成される文字列があります

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

よろしくお願いします。

4

2 に答える 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
于 2013-04-09T05:12:42.657 に答える
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
于 2013-04-09T05:20:37.237 に答える