2017-04-22 160 views
2

我有一個矩陣如下:(鄰接矩陣)更好的方法來創建邊緣列表矩陣使用鄰接矩陣

R S K 
A 1 1 0 
B 0 1 0 
C 1 0 0 
D 1 0 0 
E 0 0 1 
F 0 0 1 

的目的是得到一個正方形矩陣,這將有尺寸爲行的數量和上述矩陣中的列。這個矩陣將使用上述矩陣填寫(如果作爲1,那麼SA也應該是1),結果應該是這樣的(邊列表矩陣),

A B C D E F R S K 
A 0 0 0 0 0 0 1 1 0 
B 0 0 0 0 0 0 0 1 0 
C 0 0 0 0 0 0 1 0 0 
D 0 0 0 0 0 0 1 0 0 
E 0 0 0 0 0 0 0 0 1 
F 0 0 0 0 0 0 0 0 1 
R 1 0 1 1 0 0 0 0 0 
S 1 1 0 0 0 0 0 0 0 
K 0 0 0 0 1 1 0 0 0 

我寫了下面的代碼運行良好,我想知道是否有一種有效的方法來實現上述結果?

#READ THE FIRST DATA FRAME 
df <- read.table(text = "R S K 
1  1  0 
0  1  0 
1  0  0 
1  0  0 
0  0  1 
0  0  1", header=TRUE) 

#INPUT THE ROW NAMES IN df 
rownames(df)<-LETTERS[1:6] 
#INITIALIZE A SQUARE MATRIX WITH #ROWS=#COLUMNS=#(ROWS OF df)+#(COLUMNS OF df) 
godmat<-matrix(0, nrow = sum(dim(df)), ncol= sum(dim(df))) 
# ASSING ROW AND COLUMN NAMES 
rownames(godmat) <- c(rownames(df),colnames(df)) 
colnames(godmat) <- c(rownames(df),colnames(df)) 

#fill the matrix using df 
for (i in colnames(godmat)) 
    for (j in colnames(godmat)) { 
    godmat[i,j]=tryCatch({ godmat[i,j]<-df[which(rownames(df)==i), which(colnames(df)==j)]}, error = function(cond) { return(0)}) 
    #godmat[j,i]=godmat[i,j] 
    } 

#fill the matrix using df by copying the elements already filled 
for (i in colnames(godmat)) 
    for (j in colnames(godmat)) { 
    godmat[j,i]=godmat[i,j] 
    } 

回答

1

我們創造的0的matrix基於第一數據集的uniquedimnameslength。基於該rownames和兩個數據集的colnames之間的match,我們給「M1」至「M2」的價值觀,以轉置與「M2」

un1 <- unique(unlist(dimnames(m1))) 
m2 <- matrix(0, length(un1), length(un1), dimnames = list(un1, un1)) 
i1 <- match(rownames(m1), rownames(m2), nomatch =0) 
j1 <- match(colnames(m1), rownames(m2), nomatch = 0) 
m2[i1, j1] <- m1 
t(m2)+m2 
# A B C D E F R S K 
#A 0 0 0 0 0 0 1 1 0 
#B 0 0 0 0 0 0 0 1 0 
#C 0 0 0 0 0 0 1 0 0 
#D 0 0 0 0 0 0 1 0 0 
#E 0 0 0 0 0 0 0 0 1 
#F 0 0 0 0 0 0 0 0 1 
#R 1 0 1 1 0 0 0 0 0 
#S 1 1 0 0 0 0 0 0 0 
#K 0 0 0 0 1 1 0 0 0 
+0

謝謝,這就是我一直在尋找的東西。一個問題@akrun,將不參加將保持秩序完好?我知道這對您提供的解決方案沒有任何影響。 – vivek

+0

@vivek如果你想要一個自定義的訂單,那麼你可能不得不基於'match'或'factor'對其進行排序。 – akrun

0

你可以做到這一點使用merge添加它和rbindcbind在基R:

nm <- rownames(df) 
m <- matrix(0,nrow(df),nrow(df),dimnames = list(nm,nm)) 
p1 <- merge(m, df, by = "row.names")[-1] 
p2 <- cbind(t(df),matrix(0,ncol(df),ncol(df),dimnames = list(names(df),NULL))) 
colnames(p2) <- c(nm, names(df)) 
res <- rbind(p1,p2) 
rownames(res) <- c(nm, names(df)) 

# A B C D E F R S K 
# A 0 0 0 0 0 0 1 1 0 
# B 0 0 0 0 0 0 0 1 0 
# C 0 0 0 0 0 0 1 0 0 
# D 0 0 0 0 0 0 1 0 0 
# E 0 0 0 0 0 0 0 0 1 
# F 0 0 0 0 0 0 0 0 1 
# R 1 0 1 1 0 0 0 0 0 
# S 1 1 0 0 0 0 0 0 0 
# K 0 0 0 0 1 1 0 0 0 

p1是其中鄰接矩陣連接列方向。 p2是行方式,然後是rbind(p1,p2)。這兩個是主要部分。其餘的只是設置名稱。