我有一个矩阵如下:(邻接矩阵)
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]
}
答案 0 :(得分:1)
我们根据第一个数据集的matrix
length
创建unique
0。根据两个数据集的dimnames
和match
之间的rownames
,我们将'm1'的值分配给'm2',进行转置并将其添加为'm2'< / p>
colnames
答案 1 :(得分:0)
您可以使用基座R中的merge
和rbind
以及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)
。这两个是主要部分。其余的只是设置名称。