我有一个邻接矩阵A:
[1] [2] [3]
[1] 1 0 1
[2] 0 0 0
[3] 0 0 0
我想要一个新的矩阵B,在所有行中只填充一个,只有零,所以B:
[1] [2] [3]
[1] 0 0 0
[2] 1 1 1
[3] 1 1 1
我怎么能这样做我R
由于邻接矩阵是非负的,你可以测试零rowSums
:
A <- matrix(c(1, 0, 1,
0, 0, 0,
0, 0, 0), byrow = TRUE, nrow = 3)
B <- A * 0 # 0-matrix same dimensions as A
B[rowSums(A) == 0, ] <- 1
apply()
在这里很有用。尝试
t(apply(A, 1, function(x){ifelse(x != sum(x), 0, 1)}))
显示的apply
返回一个向量,每行A
有一个元素,如果该行全为零则为TRUE,否则为FALSE。使用回收将该向量分配给A
,以便A的每一列都填充它。这样的赋值还具有将FALSE和TRUE转换为0和1的效果。表达式是紧凑的,似乎相对简单易懂,并且不使用任何包。
replace(A, TRUE, apply(A == 0, 1, all))
赠送:
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 1 1 1
[3,] 1 1 1
这种变化甚至更短但有点棘手:
replace(A, TRUE, apply(!A, 1, all))
可重复形式的输入A
是:
A <- matrix(c(1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L), 3)
其他方式
m <- matrix( c(1, 0, 1, 0, 0, 0, 0, 0, 0), nrow = 3, byrow = T )
> m
[,1] [,2] [,3]
[1,] 1 0 1
[2,] 0 0 0
[3,] 0 0 0
m <- matrix(rep(ifelse(rowSums(m) == 0, 1, 0), dim(m)[1]), nrow = dim(m)[1])
> m
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 1 1 1
[3,] 1 1 1