在R中使用for循环的字符串之间的Jaccard相似性

在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

我试图在大的名称向量中计算每对名称之间的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. 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)