我如何使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列丢失(对称不匹配)相同。
答案 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")
)
)