R:将 mapply 用于两个向量的函数
R: using mapply for a function of two vectors
我有一个计算两个向量汉明距离的 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
长度向量,并且 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 函数:
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
长度向量,并且 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
。