2017-01-23 53 views
0

我有個矩陣,它代表的各種作業之間的移動性:摺疊/同時聚集鄰接矩陣的某些部分上的行和列

jobnames <- c("job 1","job 2","job 3","job 4","job 5","job 6","job 7") 
jobdat <- matrix(c(
5, 5, 5, 0, 0, 5, 5, 
5, 5, 2, 5, 5, 1, 5, 
1, 5, 5, 5, 0, 0, 1, 
1, 0, 5, 5, 8, 0, 1, 
0, 5, 0, 0, 5, 5, 1, 
0, 0, 5, 5, 0, 5, 5, 
0, 1, 0, 0, 5, 1, 5 
      ), 
      nrow = 7, ncol = 7, byrow = TRUE, 
      dimnames = list(jobnames,jobnames 
       )) 

這是在社交網絡中處理作爲定向,加權鄰接矩陣分析。網絡的方向是從行到列:因此,移動性被定義爲從作業行到作業列。對角線是相關的,因爲有可能在另一個公司轉變爲同一個工作。

我要崩潰這個矩陣根據包含應結合作業的指數預示列表 :現在

group.list <- list(grp1=c(1,2) ,grp2 =c(3,4)) 

,因爲它是一個鄰接矩陣,它比其他的有點不同'關於如何摺疊我在這裏和其他地方找到的矩陣的答案。在行和列上的崩潰必須是同步的。有些工作根本沒有分組。因此,結果在這個例子應該是這樣的:

group.jobnames <- c("job 1 and 2","job 3 and 4","job 5","job 6","job 7") 

group.jobdat <- matrix(c(
      20,12,5,6,10, 
      7,17,8,0,2, 
      5,0,5,5,1, 
      0,10,0,5,5, 
      1,0,5,1,5 
      ), 
      nrow = 5, ncol = 5, byrow = TRUE, 
      dimnames = list(group.jobnames,group.jobnames 
       )) 

這個例子組兩個的第一份工作,然後在接下來的兩個,但在我實際的數據可能是(的指標)工作的任何組合,以及任何每組中的工作數量。所以工作[1,7]可以是一個組,而工作[2,3,6]可以是另一個組,而工作4或5沒有分組。或者任何其他組合。

謝謝您的時間,

+0

我不能複製group.jobdat給您在group.list提供和建設group.jobdat代碼拋出一個錯誤的組。 – lmo

+0

很抱歉,我不能在明天早晨之前糾正它,因爲我再次在我的電腦中使用R。 – emilBeBri

+0

聽起來不錯。讓我知道你什麼時候做,我會看看。 – lmo

回答

1

我相信有一些拼寫錯誤的預期輸出,group.list定義。如果我的解釋是正確的,這是一個解決方案。

這是一個新的group.list,以符合所需輸出的名稱。在這個版本中,組2映射到1,組4映射到3,這與group.jobs中的文本一致。

group.list <- list(grp1=c(1, 3), grp2=c(2, 4)) 

鑑於此列表中,構建一個分組矢量

# initial grouping 
groups <- seq_len(ncol(jobdat)) 
# map elements of second list item to values of first list item 
groups[match(group.list[["grp2"]], groups)] <- group.list[["grp1"]] 

groups 
[1] 1 1 3 3 5 6 7 

所以,現在組1和2是相同的,以及3和4。現在,我們使用rowsum和耦合轉置的計算輸出。

myMat <- t(rowsum(t(rowsum(jobdat, groups)), groups)) 
# add the group names 
dimnames(myMat) <- list(group.jobnames,group.jobnames) 

myMat 
      job 1 and 2 job 3 and 4 job 5 job 6 job 7 
job 1 and 2   20   12  5  6 10 
job 3 and 4   7   20  8  0  2 
job 5     5   0  5  5  1 
job 6     0   10  0  5  5 
job 7     1   0  5  1  5 

針對下面的OP的評論,分組意欲是列表元素中,而不是像我原先解釋對應的列表元素之間的位置。爲了完成這種形式的分組,replaceReduce的重複饋送將完成該任務。 隨着group.list如問題,

group.list <- list(grp1=c(1, 2), grp2=c(3, 4)) 

groups <- Reduce(function(x, y) replace(x, x[x %in% y], min(y)), 
       c(list(groups), unname(group.list))) 
groups 
[1] 1 1 3 3 5 6 7 

這裏,replace採用原始分組,發現在那些在group.list所述向量中的一分組的元素,並且與最小值替換這些的矢量。 Reduce函數重複對原始組變量應用此操作,但在每次迭代中修改它。

有了這個結果,我們用上面的轉置和rowsum得到

myMat 
      job 1 and 2 job 3 and 4 job 5 job 6 job 7 
job 1 and 2   20   12  5  6 10 
job 3 and 4   7   20  8  0  2 
job 5     5   0  5  5  1 
job 6     0   10  0  5  5 
job 7     1   0  5  1  5 
+0

我本可以發誓我今天早上糾正了它。一定忘記推「保存編輯」或其他東西。無論如何: 它快到了!但這不太對,因爲我在代碼中輸入錯誤。 所以,這個問題有兩個方面讓我理解/使用它。我在rowsums/transpose的步驟中看到邏輯(除了我覺得有點奇怪的是rowsum()沒有對應的colsum()函數,但是無論如何) – emilBeBri

+0

1) 現在group.list **是**正確,它不像你解釋它:(在我的Q_中也糾正了): 'group.list < - list(grp1 = c(1,2),grp2 = c(3,4))' 這就是我的分組列表的結構。然而,如果我以這種方式使用列表,那麼作業1和作業3正在分組,而作業2和作業4 ...... 而這導致第二個問題: 2) 我有點困惑如何以任意數量的團體來做這件事。在我的實際數據集中有80個組(+和一個小的 未分組的作業數量,但也必須在新矩陣中), – emilBeBri

+1

非常感謝,您真的幫助我完成了我論文中的一些重要內容這裏。週末愉快。 – emilBeBri