2

シーケンスの長いリスト間のペアワイズ差の数を計算し、それを行列形式に戻そうとしています。これは私がやりたいことのおもちゃの例です。

library(MiscPsycho)
b <- c("-BC", "ACB", "---") # Toy example of sequences
workb <- expand.grid(b,b)
new <- c(1:9)

# Need to get rid of this for loop somehow
for (i in 1:9) {
new[i] <- stringMatch(workb[i,1], workb[i,2], normalize="NO")
}

workb <- cbind(workb, new)
newmat <- reShape(workb$new, id=workb$Var1, colvar=workb$Var2)

a <- c("Subject1", "Subject2", "Subject3") #Relating it back to the subject ID
colnames(newmat) <- a
rownames(newmat) <- a
newmat

私はapply関数の使用にあまり慣れていませんが、forループを置き換えることができるように使用したいと思います。これは、シーケンスの数が多いことを考えると、おそらく遅くなります。(stringMatch関数はMiscPsychoからのものです)。より効率的にする方法を教えてください!

どうもありがとうございます!

4

3 に答える 3

2

それらの「ペアワイズ距離」を取得するには、次のようなことを行います。

  Vm <- Vectorize(stringMatch)
  nex <- outer(b,b, FUN=Vm, normalize = "NO")
 nex
     [,1] [,2] [,3]
[1,]    0    3    2
[2,]    3    0    3
[3,]    2    3    0
于 2012-06-19T19:38:51.393 に答える
0

ループを置き換えるには

new <- apply(workb, 1, function(x) stringMatch(x[[1]],x[[2]], normalize="NO"))
于 2012-06-19T18:44:50.387 に答える
0

インデックス、、を受け取りi、を返す関数を作成しますnew[i]

myfun <- function(i) {
  stringMatch(workb[i, 1], workb[i, 2], normalize='NO')
}

apply次に、新しいベクトルに沿って実行できます。

workb$new <- unlist(lapply(new, myfun))

一般に、for loopRで正しく使用しています。事前にベクトルを割り当て、new成長させるのではなく、塗りつぶしています。

于 2012-06-19T18:45:15.910 に答える