我有很多列表包含不同数量的名义元素。我想将每个列表与每个其他列表进行比较,并针对每个组合计算两个列表共享的元素数量。我不是统计学家,但我认为结果在矩阵中最容易表示。
list1=["Joe","Hanna","Alice"]
list2=["Martin","Ted","Joe"]
list3=["Hanna","Ted","Joe"]
之后我想以图形方式表示结果,可能使用热图或聚类表示。
任何人都可以给我一些提示如何使用R?还有什么是好的代表? 非常感谢!
答案 0 :(得分:6)
您可以使用crossprod
,table
和stack
(假设您的数据采用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
请参阅heatmap
或heatmap.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())