使用邻接矩阵创建边缘列表矩阵的更好方法

时间:2017-04-22 18:20:36

标签: r matrix

我有一个矩阵如下:(邻接矩阵)

   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

目标是获得一个方阵,其尺寸为上述矩阵中的行数和列数。该矩阵将使用上述矩阵填充(如果A-S为1,则S-A也应为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]
  }

2 个答案:

答案 0 :(得分:1)

我们根据第一个数据集的matrix length创建unique 0。根据两个数据集的dimnamesmatch之间的rownames,我们将'm1'的值分配给'm2',进行转置并将其添加为'm2'< / p>

colnames

答案 1 :(得分:0)

您可以使用基座R中的mergerbind以及cbind执行此操作:

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)。这两个是主要部分。其余的只是设置名称。