【问题标题】:Jaccard Similarity between strings using a for loop in R在R中使用for循环的字符串之间的Jaccard相似度
【发布时间】:2018-03-26 19:32:24
【问题描述】:

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

【问题讨论】:

  • 我会尝试查看 quadback_names 和 draft_names 是否有你给他们的输入。我不确定,但names(df) = c("A.J. Doyle", "A.J. Graham", "A.J. Porter") 可能有错误。
  • 没有我可以检测到的错误。 for 循环之上的所有内容都完全符合您的预期。
  • 你应该使用stringdistmatrix函数:stringdistmatrix(quarterback_names, draft_names, method = "jaccard", q = 2)

标签: r for-loop similarity


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您需要返回更改后的数据框:

    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_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
    

    【讨论】:

      【解决方案3】:

      原因: 没有明确的回报。

      Reference

      您可以添加打印和调试,如下所示并跟踪

      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_similarity(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
      

      并将输出分配给新变量,而不是覆盖现有的df

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-02
        • 1970-01-01
        • 1970-01-01
        • 2016-09-05
        • 2018-01-23
        • 2020-03-12
        相关资源
        最近更新 更多