【问题标题】:Comparing different and unequal lists in R to find the most similar candidates比较 R 中不同和不相等的列表以找到最相似的候选者
【发布时间】:2021-08-16 05:57:47
【问题描述】:

我正在尝试在 R 中进行一些基本的关键字匹配,但由于列表不同且不相等,我无法完全弄清楚。 想象一下,我有五种不同鸟类(鸟类)的描述,以及四个具有这些描述子集的标本(标本)。

birds <- list(
  bird_1 = c("scolopacidae", "wet", "omnivore", "large", "siberia"),
  bird_2 = c("woodland", "scolopacidae", "medium", "siberia", "omnivore"),
  bird_3 = c("wet", "charadriidae", "insectivore", "medium", "tasmania"),
  bird_4 = c("siberia", "apodidae", "insectivore", "arial", "medium"),
  bird_5 = c("meropidae", "wet forest", "omnivore", "small", "australia")
)

specimens <- list(
  specimen_1 = c("nectarivore", "scolopacidae", "alaska"),
  specimen_2 = c("alaska", "scolopacidae", "woodland", "omnivore"),
  specimen_3 = c("china", "sylviidae", "south australia"),
  specimen_4 = c("wet forest", "small", "tasmania", "insectivore", "charadriidae")
)

我正在尝试将每个标本与每只鸟进行比较,并计算它们共享的描述符数量。

最终,对于每个标本,我想返回它匹配的可能鸟类的排名顺序,从最对应的描述符到最少。例如:标本_4 = 小鸟_3、小鸟_5、小鸟_4、小鸟_1、小鸟_2

谁能指出我正确的方向?非常感谢您的帮助。

【问题讨论】:

    标签: r list keyword similarity


    【解决方案1】:

    你可以求助outer -

    calculate <- function(x, y) sum(x %in% y)
    outer(birds, specimens, Vectorize(calculate))
    
    #       specimen_1 specimen_2 specimen_3 specimen_4
    #bird_1          1          2          0          0
    #bird_2          1          3          0          0
    #bird_3          0          0          0          3
    #bird_4          0          0          0          1
    #bird_5          0          1          0          2
    

    【讨论】:

      【解决方案2】:

      这是解决问题的一种可能方法:

      out = sapply(specimens, function(s) sapply(birds, function(b) length(intersect(s, b))))
      
      #        specimen_1 specimen_2 specimen_3 specimen_4
      # bird_1          1          2          0          0
      # bird_2          1          3          0          0
      # bird_3          0          0          0          3
      # bird_4          0          0          0          1
      # bird_5          0          1          0          2
      
      
      ranks <- sapply(colnames(out), function(s) names(sort(out[,s], TRUE)))
      
      #    specimen_1 specimen_2 specimen_3 specimen_4
      # [1,]  "bird_1"   "bird_2"   "bird_1"   "bird_3"  
      # [2,]  "bird_2"   "bird_1"   "bird_2"   "bird_5"  
      # [3,]  "bird_3"   "bird_5"   "bird_3"   "bird_4"  
      # [4,]  "bird_4"   "bird_3"   "bird_4"   "bird_1"  
      # [5,]  "bird_5"   "bird_4"   "bird_5"   "bird_2"
      

      【讨论】:

        猜你喜欢
        • 2014-07-15
        • 2012-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-24
        • 2014-07-19
        • 1970-01-01
        相关资源
        最近更新 更多