如何为stringMatch函数使用apply而不是for循环?

如何为stringMatch函数使用apply而不是for循环?,r,for-loop,string-matching,apply,R,For Loop,String Matching,Apply,我试图计算一长串序列之间成对差异的数量,并将其转换成矩阵形式。这是我想做的一个玩具例子 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] <- stringMa

我试图计算一长串序列之间成对差异的数量,并将其转换成矩阵形式。这是我想做的一个玩具例子

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
库(杂项)
b更换线圈

new <- apply(workb, 1, function(x) stringMatch(x[[1]],x[[2]], normalize="NO"))

new我将创建一个函数,它获取您的索引
I
,并返回
new[I]

myfun <- function(i) {
  stringMatch(workb[i, 1], workb[i, 2], normalize='NO')
}
一般来说,您在R中正确地使用了一个
for loop
。您已经事先分配了向量
new
,并且正在填充它,而不是增加它。

要获得这些“成对距离”,我应该执行以下操作:

  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

Vm我只有在收到这样的消息时才会想到它:
外部出错(b,b,FUN=stringMatch):dims[product 9]与对象[1]的长度不匹配。
非常感谢!!这很好用,而且比我的效率高很多。太好了,谢谢!!这正是我希望写的,但我只是对语法感到困惑。有没有办法让代码更高效?下面的不同解决方案对短序列很有效,但我有几百个序列,我正试图为它们构造一个成对的差分矩阵,每个序列都有相同的长度(大约300个字符)。当我使用下面的代码时,仅仅制作一个比较20个序列的矩阵就需要半个多小时。。。
  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