表示R中列表之间的相似性

时间:2014-03-06 10:46:05

标签: r matrix cluster-analysis heatmap similarity

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

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

Similarities

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

任何人都可以给我一些提示如何使用R?还有什么是好的代表? 非常感谢!

3 个答案:

答案 0 :(得分:6)

您可以使用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中: - )

答案 1 :(得分: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)会给出一个很好的图形表示。

答案 2 :(得分:1)

我建议在这种情况下使用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())

enter image description here