使用 mapply 计算行名和列名之间的 levenshteinDist
Calculate levenshteinDist between rownames and colnames using mapply
我想使用mapply函数计算矩阵的行名和列名之间的levenshteinDist距离:因为may矩阵的体积太大并且使用嵌套循环"for"需要很长时间给我结果。
这是带有嵌套循环的旧代码:
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。
可能吗?
谢谢。
在此上下文中无法使用函数 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
)。
我想使用mapply函数计算矩阵的行名和列名之间的levenshteinDist距离:因为may矩阵的体积太大并且使用嵌套循环"for"需要很长时间给我结果。
这是带有嵌套循环的旧代码:
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。
可能吗?
谢谢。
在此上下文中无法使用函数 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
)。