我正在尝试计算一长串序列之间的成对差异的数量,并将其重新放回矩阵形式。这是我想要做的一个玩具示例。
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)。请让我知道如何提高效率!
非常感谢!
答案 0 :(得分: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
答案 1 :(得分:0)
替换循环
new <- apply(workb, 1, function(x) stringMatch(x[[1]],x[[2]], normalize="NO"))
答案 2 :(得分:0)
我会创建一个获取索引i
并返回new[i]
的函数。
myfun <- function(i) {
stringMatch(workb[i, 1], workb[i, 2], normalize='NO')
}
然后你可以apply
沿着你的新载体:
workb$new <- unlist(lapply(new, myfun))
一般情况下,您在R中正确使用了for loop
。您已经预先分配了向量new
并填充了它而不是增长它。