我有两个不同维度的邻接矩阵。我想让它们的维度兼容,这样当我将其中一个矩阵的任何一列替换为第二个矩阵的任何一列时,就不会出现以下错误信息: 错误:要替换的项目数量不是替换长度的倍数 这是我的矩阵:
> mat1
Tommy Roy Addy Sam
Tommy 0 1 0 -1
Roy -1 -1 1 0
Addy 1 0 -1 0
Sam 0 0 -1 1
> mat2
Mike Roy Addy Sam Dan
Mike 0 1 0 -1 0
Roy -1 -1 1 0 1
Addy 1 0 -1 0 -1
Sam 0 0 -1 1 0
Dan 1 0 0 -1 1
为了使mat1与mat2兼容,我需要在mat1中添加2列和2行,使其变为:
> newMat1
Tommy Roy Addy Sam Mike Dan
Tommy 0 1 0 -1 0 0
Roy -1 -1 1 0 0 0
Addy 1 0 -1 0 0 0
Sam 0 0 -1 1 0 0
Mike 0 0 0 0 0 0
Dan 0 0 0 0 0 0
这里添加了2行2列新数据(Mike
和 Dan
),因为它们之前不存在于原矩阵中。请注意,新添加的行和列已经被初始化为值 0
。同样,新的矩阵将变为:
> newMat2
Mike Roy Addy Sam Dan Tommy
Mike 0 1 0 -1 0 0
Roy -1 -1 1 0 1 0
Addy 1 0 -1 0 -1 0
Sam 0 0 -1 1 0 0
Dan 1 0 0 -1 1 0
Tommy 0 0 0 0 0 0
以下是原始矩阵的dput结果:
> dput(mat1)
structure(c(0L, -1L, 1L, 0L, 1L, -1L, 0L, 0L, 0L, 1L, -1L, -1L,
-1L, 0L, 0L, 1L), .Dim = c(4L, 4L), .Dimnames = list(c("Tommy",
"Roy", "Addy", "Sam"), c("Tommy", "Roy", "Addy", "Sam")))
> dput(mat2)
structure(c(0L, -1L, 1L, 0L, 1L, 1L, -1L, 0L, 0L, 0L, 0L, 1L,
-1L, -1L, 0L, -1L, 0L, 0L, 1L, -1L, 0L, 1L, -1L, 0L, 1L), .Dim = c(5L,
5L), .Dimnames = list(c("Mike", "Roy", "Addy", "Sam", "Dan"),
c("Mike", "Roy", "Addy", "Sam", "Dan")))
编辑:
如问题所述,我想在矩阵之间替换列,但问题在于当我这样做时,列名称和行名称的不同顺序会影响索引中的值。例如:
Change <- c("Mike", "Dan")
for(i in 1:length(Change)){
ifelse(Change[i] %in% colnames(newMat1), newMat1[,Change[i]] <- newMat2[,Change[i]], newMat1[,Change[i]][newMat1[,Change[i]] == 1] <- 0)}
newMat1
Tommy Roy Addy Sam Mike Dan
Tommy 0 1 0 -1 0 0
Roy -1 -1 1 0 -1 1
Addy 1 0 -1 0 1 -1
Sam 0 0 -1 1 0 0
Mike 0 0 0 0 1 1
Dan 0 0 0 0 0 0
这里将newMat1中的Mike列替换为newMat2中的Mike列。您可以看到,原始newMat2中的Mike-to-Mike索引为0,但在新获得的newMat1中为1,这是因为行名和列名的排序不同。
回答: 为了达到这个目的,需要进行排序,方法如下:
newMat2 <- newMat2[rownames(newMat1), colnames(newMat1)]
newMat2 <- newMat2[rownames(newMat1), colnames(newMat1)]
。 - Axeman