R:

2014-11-04 63 views
0

我有以下列表的新列表,關係:R:

Koppels
[[1]]
[1] 3634 3635

[[2]] 
[1] 5110 5200 

[[3]] 
[1] 5110 5951 

[[4]] 
[1] 5200 5951 

[[5]] 
[1] 5535 26398 

[[6]] 
[1] 5699 7339 

對於每一個元素這意味着他們和彼此之間有聯繫。所以「3634」和「3635」與彼此有關係。

因此,[[2]],[[3]][[4]]的結果是「5200」,「5951」和「5110」與彼此有關係。

所以現在我想要一個新的列表,我得到一個像5200 5951 5110這樣的元素,而不是像上面列表中的三個單獨的元素。但是像[[1]],[[5]][[6]]這樣的元素也必須在列表中。

我在這裏使用的列表只是我使用的原始列表的一小部分。所以代碼也必須適用於更大的列表。

dput(Koppels) 
list(c(3634, 3635), c(5110, 5200), c(5110, 5951), c(5200, 5951 
), c(5535, 26398), c(5699, 7339), c(5912, 5913), c(7961, 8558 
), c(10473, 10474), c(10475, 10476), c(23462, 23476), c(23750, 
23751), c(23750, 23752), c(23751, 23752), c(23753, 23755), c(24827, 
24828), c(26046, 26047), c(26048, 26049), c(26298, 26299)) 
+1

你能否幫我們一個忙,分享'dput(Koppels)'而不是控制檯上打印的內容? – A5C1D2H2I1M1N2O1R2T1 2014-11-04 16:16:33

+0

您是否嘗試將對分組到連接的網絡中,以便您最終得到一個沒有連接的項目列表? 'igraph'軟件包中的某些功能可以輕鬆完成。 – Spacedman 2014-11-04 16:31:13

+0

或者,你是否試圖讓所有的人都是彼此的朋友(派系)? – dash2 2014-11-04 16:41:45

回答

3

使用包的igraph:

library(igraph) 
g <- graph.data.frame(do.call(rbind.data.frame, Koppels), directed=FALSE) 
plot(g) 

resulting plot

split(V(g)$name, clusters(g)$membership) 
#$`1` 
#[1] "3634" "3635" 
# 
#$`2` 
#[1] "5110" "5200" "5951" 
# 
#$`3` 
#[1] "5535" "26398" 
#... 

根據需要調整。

+1

你可能想在某處粘貼'directed = FALSE'。 – Spacedman 2014-11-04 16:54:59

0

如果你想獲得朋友朋友列表,試試這個。在大型數據集上可能會很慢 - 您可以進行大量優化。

Koppels <- list(c(3634, 3635), c(5110, 5200), c(5110, 5951), c(5200, 5951 
), c(5535, 26398), c(5699, 7339), c(5912, 5913), c(7961, 8558 
), c(10473, 10474), c(10475, 10476), c(23462, 23476), c(23750, 
23751), c(23750, 23752), c(23751, 23752), c(23753, 23755), c(24827, 
24828), c(26046, 26047), c(26048, 26049), c(26298, 26299)) 

nums <- unique(unlist(Koppels)) 

friends <- function (nums) unique(unlist(sapply(Koppels, function (x) 
    if (any(nums %in% x)) return(x) else return(c())))) 

friendlist <- Koppels 

newfriends <- TRUE 
while (newfriends) { 
    newfriends <- FALSE 
    for (i in seq_along(friendlist)) { 
    l <- friendlist[[i]] 
    fr <- friends(l) 
    if (! all(fr %in% l)) newfriends <- TRUE 
    friendlist[[i]] <- fr 
    } 
} 
unique(friendlist)