如何在矩阵中标识零的行/列丢失零? (对称不匹配)

时间:2019-05-16 21:12:57

标签: r matrix

我如何使R能够识别矩阵中缺少的行/列,并插入等于0的这些行/列值?

下面是一个简化的想法,但请记住,我的0矩阵非常大,无法检查缺少哪些行/列。

4x4 Matrix
    1   2   3   4
1   0   0   0   0
2   0   0   0   0
3   0   0   0   0
4   0   0   0   0

3x3 matrix  
    1   2   4
1   1   4   7
2   2   5   8
4   3   6   9

4x4 solution matrix
    1   2   3   4
1   1   4   0   7
2   2   5   0   8
3   0   0   0   0
4   3   6   0   9

在示例中,您可能会看到3x3矩阵缺少第三行/列。第n行丢失与第n列丢失(对称不匹配)相同。

2 个答案:

答案 0 :(得分:2)

这是@ r2evans解决方案的逐步通用版本:

创建所需“解决方案”大小的零矩阵

m1 <- matrix(0, 4, 4)

在这个示例中,我们需要一个示例数据矩阵

m2 <- matrix(1:9, 3, 3, dimnames=list(c(1,2,4), c(1,3,4)))
m2
#  1 3 4
#1 1 4 7
#2 2 5 8
#4 3 6 9

使用行和列名称获取放置m2值的位置

location_mat <- cbind(
                  as.numeric(rep(rownames(m2), ncol(m2))), 
                  as.numeric(rep(colnames(m2), each=nrow(m2))) 
                  )

为清楚起见,将m2的值放入向量

value_vec <- as.vector(m2)

然后,根据m2的行名和列名,在正确的位置用m2中的值“填充”零矩阵(这是发生所有魔术的地方)

m1[location_mat] <- value_vec

m1现在应该是所需的矩阵

m1
#     [,1] [,2] [,3] [,4]
#[1,]    1    0    4    7
#[2,]    2    0    5    8
#[3,]    0    0    0    0
#[4,]    3    0    6    9

答案 1 :(得分:0)

相对简单的解决方案是通过设置first和second的维名称之间的差异来子集第一个矩阵,然后将second的元素分配给first的对应元素(如@ r2evans在他的第一个评论中建议的那样):

first[
  dimnames(first)[[1]] %in% dimnames(second)[[1]], 
  dimnames(first)[[2]] %in% dimnames(second)[[2]]
  ] <- second

# > first
#
#   1 2 3 4
# 1 1 4 0 7
# 2 2 5 0 8
# 3 0 0 0 0
# 4 3 6 0 9

数据:

first <- structure(
  c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L),
  .Dim = c(4L, 4L),
  .Dimnames = list(
    c("1", "2", "3", "4"), 
    c("1", "2", "3", "4")
    )
)

second <- structure(
  1:9,
  .Dim = c(3L, 3L),
  .Dimnames = list(
    c("1", "2", "4"), 
    c("1", "2", "4")
    )
  )