2011-02-25 35 views
0

通過一些幫助,我想出瞭如何將edgelist,aka,adjacency list轉換爲adjacency matrix.我想了解如何自動執行此操作大量邊界列表,然後將得到的鄰接矩陣放入列表中。plyr應用程序,創建每個對應於數據子集的矩陣列表

我猜plyr是做這件事的最好方法,但是如果你想告訴我如何用循環做到這一點,我會很感激。好奇的是,這些數據代表了不同學校的社交網絡。

這裏是我到目前爲止有:

 # extract one school edgelist from the dataframe 
aSchool <- myDF[which(myDF$school==1), c("school", "id", "x1","x2","x3","x4","x5","x6","x7","x8","x9","x10")] 

    # figure out unique ids 
edgeColumns <- c("x1","x2","x3","x4","x5","x6","x7","x8","x9","x10") 
ids <- unique(unlist(aSchool[edgeColumns])) 
ids <- ids[!is.na(ids)] 
    # make an empty matrix 
m <- matrix(0,nrow=length(ids),ncol=length(ids)) 
rownames(m) <- colnames(m) <- as.character(ids) 
    # fill in the matrix 
for(col in edgeColumns){ 
     theseEdges <- aSchool[c("id",col)] 
     theseEdges <- na.omit(theseEdges) 
     theseEdges <- apply(theseEdges,1,as.character) 
     theseEdges <- t(theseEdges) 
     m[theseEdges] <- m[theseEdges] + 1 
} 
for(i in 1:nrow(m)) m[i,i] <- 0 
+0

我很難理解myDF是什麼。你可以粘貼dput(myDF)的輸出,這樣我們可以重現你的數據嗎? – 2011-02-25 01:13:54

回答

2

退房的SNA packageas.edgelist.sna()as.sociomatrix.sna()功能。

特別是,as.sociomatrix.sna()看起來像是一個完美的解決方案:它被設計爲在一個步驟中將邊界列表轉換爲鄰接矩陣(不會丟失頂點名稱等屬性)。打包電話給lapply(),我想你已經有了另外一個(也許勞動密集度更低的解決方案)解決方案。

如果你想看到一個更富有表現力的答案,我認爲這將是有益的或者提供更完整的樣本數據或者什麼是myDF

而且更清晰的描述,我沒有SO這樣做的聲譽,但我會添加一些標籤到這個職位,以表明它是關於網絡分析。

+0

這是一個驚人的便利!我想學習如何編碼這些東西,但我希望我知道sna早些時候有這樣的功能。謝謝你的指針。 – 2011-02-25 05:05:50

+0

很高興幫助 - 當我第一次意識到這些'sna'功能可以做到的時候,他們完全打亂了我的想法。 – ashaw 2011-02-25 13:27:04

1

它很難回答你的問題沒有一個可行的例子。但是,如果我明白你的問題正確這裏是應該工作(返回一個包含symmetrican鄰接矩陣列表)功能:

makeADJs <- function(...) 
{ 
require(plyr) 
dfs <- list(...) 

e2adj <- function(x) 
{ 
    IDs <- unique(c(as.matrix(x))) 
    df <- apply(x,2,match,IDs) 
    adj <- matrix(0,length(IDs),length(IDs)) 
    colnames(adj) <- rownames(adj) <- IDs 
    a_ply(rbind(df,df[,2:1]),1,function(y){adj[y[1],y[2]] <<- 1}) 
    return(adj) 
} 
llply(dfs,e2adj) 
} 

例子:

makeADJs(
    cbind(letters[sample(1:26)],letters[sample(1:26)]), 
    cbind(letters[sample(1:26)],letters[sample(1:26)]), 
    cbind(letters[sample(1:26)],letters[sample(1:26)]), 
    cbind(letters[sample(1:26)],letters[sample(1:26)]) 
    ) 

編輯:

或者不plyr

makeADJs <- function(...) 
{ 
    dfs <- list(...) 
    e2adj <- function(x) 
    { 
     IDs <- unique(c(as.matrix(x))) 
     df <- apply(x,2,match,IDs) 
     adj <- matrix(0,length(IDs),length(IDs)) 
     colnames(adj) <- rownames(adj) <- IDs 
     apply(rbind(df,df[,2:1]),1,function(y){adj[y[1],y[2]] <<- 1}) 
     return(adj) 
    } 
    lapply(dfs,e2adj) 
} 

編輯2:

並繪製他們都在一個單一的PDF文件:

library(qgraph) 
pdf("ADJplots.pdf") 
l_ply(adjs,function(x)qgraph(x,labels=colnames(x))) 
dev.off() 
+0

謝謝!我將通過這個工作來嘗試理解它,因爲它是廣泛適用的。 – 2011-02-25 05:03:24