使用mapply计算rownames和colnames之间的levenshteinDist

时间:2016-01-06 09:17:19

标签: r matrix levenshtein-distance mapply

我想使用mapply函数计算矩阵的rownames和colnames之间的levenshteinDist距离:因为may矩阵的体积太大而且使用嵌套循环"对于"花很长时间才能给我结果。

这里是嵌套循环的旧代码:

mymatrix  <- matrix(NA, nrow=ncol(dataframe),ncol=ncol(dataframe),dimnames=list(colnames(dataframe),colnames(dataframe)))
distfunction = function (text1, text2) {return(1 - (levenshteinDist(text1, text2)/max(nchar(text1), nchar(text2))))}
for(i in 1:ncol(mymatrix))
{
  for(j in 1:nrow(mymatrix))

   mymatrix[i,j]=(distfunction(rownames(mymatrix)[i], colnames(mymatrix)[j]))*100
 }

我试图通过mapply切换嵌套循环:

   mapply(distfunction,mymatrix)

它给了我这个错误:

   Error in typeof(str2) : argument "text2" is missing, with no default

我计划将levenshteinDist距离应用到我的矩阵,然后总结如何应用myfunction。

有可能吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

在此上下文中不能使用函数mapply。它需要两个输入向量,并且该函数应用于第一个元素,第二个元素,...等等。但是你想要应用所有组合。

您可以尝试堆叠sapply

sapply(colnames(mymatrix), function(col) 
  sapply(rownames(mymatrix), function(row) 
    distfunction(row, col)))*100

简单用法示例

sapply(1:3, function(x) sapply(1:4, function(y) x*y))

输出:

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    4    6
[3,]    3    6    9
[4,]    4    8   12

更新

更好的方法是使用outer,但我认为您的distfunction未进行矢量化(由于max)。所以使用包装函数Vectorize

distfunction_vec <- Vectorize(distfunction)
outer(rownames(mymatrix), rownames(mymatrix), distfunction_vec)

但我不确定性能损失。最好直接矢量化函数(可能使用pmax)。