2014-03-06 51 views
0

我有很多包含不同數量名義元素的列表。我想將每個列表與每個其他列表進行比較,並且對於每個組合計數這兩個列表共享多少個元素。我不是統計學家,但我想在矩陣中代表最簡單的結果。表示R中的列表之間的相似性

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

Similarities

後來我想以圖形方式表示的結果,也許用熱圖或集羣表示。

任何人都可以給我一些提示如何使用R做到這一點?還有什麼好的代表? 非常感謝!

回答

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)將給出一個很好的圖形表示,例如。

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

5

您可以使用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如果你正在尋找一個熱圖:-)