在R中使用for循环的字符串之间的Jaccard相似性
我试图在大的名称向量中计算每对名称之间的jaccard相似性(参见下面的小示例),并将它们的jaccard相似性存储在矩阵中。我的函数只是返回NULL。我做错了什么在R中使用for循环的字符串之间的Jaccard相似性,r,for-loop,similarity,R,For Loop,Similarity,我试图在大的名称向量中计算每对名称之间的jaccard相似性(参见下面的小示例),并将它们的jaccard相似性存储在矩阵中。我的函数只是返回NULL。我做错了什么 library(dplyr) df = data.frame(matrix(NA, ncol=3, nrow=3)) df = df %>% mutate_if(is.logical, as.numeric) names(df) = c("A.J. Doyle", "A.J. Graham", "A.J. Port
library(dplyr)
df = data.frame(matrix(NA, ncol=3, nrow=3))
df = df %>%
mutate_if(is.logical, as.numeric)
names(df) = c("A.J. Doyle", "A.J. Graham", "A.J. Porter")
draft_names = names(df)
row.names(df) = c("A.J. Feeley", "A.J. McCarron", "Aaron Brooks")
quarterback_names = row.names(df)
library(stringdist)
jaccard_similarity = function(d){
for (i in 1:nrow(d)){
for(j in 1:ncol(d)){
d[i,j] = stringdist(quarterback_names[i], draft_names[j], method ='jaccard', q=2)
}
}
}
df = jaccard_similarity(df)
您需要返回已更改的数据帧:
jaccard_similarity = function(d){
for (i in 1:nrow(d)){
for(j in 1:ncol(d)){
d[i,j] = stringdist(quarterback_names[i], draft_names[j], method ='jaccard', q=2)
}
}
return(d)
// ^^^
}
之后
jaccard\u相似性(df)
A.J. Doyle A.J. Graham A.J. Porter
A.J. Feeley 0.6428571 0.7500000 0.7500000
A.J. McCarron 0.7647059 0.7777778 0.7777778
Aaron Brooks 1.0000000 1.0000000 1.0000000
在
for
循环之后,您不会返回任何内容。在函数末尾使用return(d)
这个问题也是outer
的一个典型用例:
outer(quarterback_names,draft_names,FUN=stringdist,method="jaccard",q=2)
[,1] [,2] [,3]
[1,] 0.6428571 0.7500000 0.7500000
[2,] 0.7647059 0.7777778 0.7777778
[3,] 1.0000000 1.0000000 1.0000000
原因:
没有明确的回报
您可以像下面那样添加打印和调试以及跟踪
jaccard_similarity = function(d){
for (i in 1:nrow(d)){
for(j in 1:ncol(d)){
d[i,j] = stringdist(quarterback_names[i], draft_names[j], method ='jaccard', q=2)
print(d[i,j])
}
}
return(d)
}
输出:
[1] 0.6428571
[1] 0.75
[1] 0.75
[1] 0.7647059
[1] 0.7777778
[1] 0.7777778
[1] 1
[1] 1
[1] 1
您只需调用jaccard\u相似度(df)
即可获得值
output <-jaccard_similarity(df)
A.J. Doyle A.J. Graham A.J. Porter
A.J. Feeley 0.6428571 0.7500000 0.7500000
A.J. McCarron 0.7647059 0.7777778 0.7777778
Aaron Brooks 1.0000000 1.0000000 1.0000000
输出我会尝试查看四分卫和选秀队员的名字是否有你给他们的输入。我不确定,但是names(df)=c(“A.J.Doyle”、“A.J.Graham”、“A.J.Porter”)
可能有错误。我无法检测到任何错误。for循环上面的所有操作都完全符合您的预期。您应该使用stringdistmatrix
函数:stringdistmatrix(四分卫姓名,草稿姓名,method=“jaccard”,q=2)
。