【问题标题】:Represent similarities between lists in R表示 R 中列表之间的相似性
【发布时间】:2014-04-08 22:45:48
【问题描述】:

我有很多列表,其中包含不同数量的名义元素。我想将每个列表与每个其他列表进行比较,并为每个组合计算两个列表共享多少元素。我不是统计学家,但我想结果最容易用矩阵表示。

list1=["Joe","Hanna","Alice"]
list2=["Martin","Ted","Joe"]
list3=["Hanna","Ted","Joe"]

之后我想以图形方式表示结果,可能使用热图或集群表示。

谁能给我一些提示如何使用 R 来做到这一点?还有什么是好的代表? 非常感谢!

【问题讨论】:

    标签: r matrix cluster-analysis heatmap similarity


    【解决方案1】:

    您可以使用crossprodtablestack(假设您的数据采用 TWL 共享的形式):

    data <- list(list1=c("Joe","Hanna","Alice"), 
                 list2=c("Martin","Ted","Joe"), 
                 list3=c("Hanna","Ted","Joe"))
    crossprod(table(stack(data)))
    #        ind
    # ind     list1 list2 list3
    #   list1     3     1     2
    #   list2     1     3     2
    #   list3     2     2     3
    

    如果您正在寻找热图,请将其包装在 heatmap 中:-)

    【讨论】:

      【解决方案2】:

      intersect() 返回两个集合的交集:

      list1 <- list("Joe","Hanna","Alice")
      list2 <- list("Martin","Ted","Joe")
      list3 <- list("Hanna","Ted","Joe")
      list <- list(list1=list1, list2=list2, list3=list3)
      
      result <- matrix(NA, length(list), length(list))
      colnames(result) <- rownames(result) <- names(list)
      
      for(i in 1:length(list)){
          for(j in i:length(list)){
              result[i, j] <- length(intersect(list[[i]], list[[j]]))    
              result[j, i] <- result[i, j]     
          }
      }
      result
       ##           list1 list2 list3
       ## list1     3     1     2
       ## list2     1     3     2
       ## list3     2     2     3
      

      image(result) 会给出一个很好的图形表示,例如。

      【讨论】:

        【解决方案3】:

        我建议在这种情况下使用sapply

        data <- list(list1=c("Joe","Hanna","Alice"), 
                     list2=c("Martin","Ted","Joe"), 
                     list3=c("Hanna","Ted","Joe"))
        
        mat <- sapply(data, function(x) sapply(data, function(y) length(intersect(x,y))))
        
        print(mat)
        
        #       list1 list2 list3
        # list1     3     1     2
        # list2     1     3     2
        # list3     2     2     3
        

        请参阅 heatmapheatmap.2 函数以获取集群表示,或者您可以尝试 ggplot2 以获得更好的视觉输出和带有离散颜色编码的图例:

        # require(reshape2)
        df <- melt(mat)
        
        # require(ggplot2)
        ggplot(data=df, aes(x=Var1, y=Var2)) + geom_tile(aes(fill=factor(value))) +
        scale_fill_brewer(palette="Blues") +
        theme(axis.title=element_blank(), legend.title=element_blank())
        

        【讨论】:

          猜你喜欢
          • 2021-08-18
          • 1970-01-01
          • 2019-03-27
          • 2016-08-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-11
          • 2019-08-05
          相关资源
          最近更新 更多