我有一个 R 函数可以计算两个向量的汉明距离:
Hamming = function(x,y){
get_dist = sum(x != y, na.rm=TRUE)
return(get_dist)
}
我想在不使用 for 循环的情况下应用于两个矩阵 M1、M2 的每一行。我目前拥有的(其中 L 是 M1 和 M2 中的行数)是非常耗时的循环:
xdiff = c()
for(i in 1:L){
xdiff = c(xdiff, Hamming(M1[i,],M2[i,]))
}
我认为这可以通过执行来完成
mapply(Hamming, t(M1), t(M2))
(使用转置,因为 mapply 跨列工作),但这不会为每一行生成长度为 L 的汉明距离向量,所以我可能误解了 mapply 在做什么。
在 R apply 系列中是否有直接应用 mapply 或其他东西可以工作?
最佳答案
如果 dim(M1)
和 dim(M2)
相同,那么您可以简单地执行以下操作:
rowSums(M1 != M2, na.rm = TRUE)
您对 mapply
的尝试没有成功,因为 m
-by-n
矩阵存储为 m*n
-length 向量,mapply
这样处理它们。要使用 mapply
完成此操作,您需要将每个矩阵拆分为行向量列表:
mapply(Hamming, asplit(M1, 1L), asplit(M2, 1L))
不过,vapply
会更好:
vapply(seq_len(nrow(M1)), function(i) Hamming(M1[i, ], M2[i, ]), 0L)
无论如何,只需使用rowSums
。
关于R:将 mapply 用于两个向量的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71166307/