将矩阵列添加到R中其他矩阵的列中

时间:2017-10-25 14:45:20

标签: r matrix

我有一个简单的问题,但无法找到一个好的解决方案。所以希望,有人可以提供帮助:)

我想将矩阵B的每一列添加到矩阵A的列中,其中索引向量指定应该将此列的A列添加到该列。因此,有可能在A的同一列中添加了多个B列。我想积累这些更改而不是替换它们。

这是一个带有for循环的工作解决方案:

A <- matrix(0, ncol = 4, nrow = 4)
B <- matrix(c(1, 0, 0, 0, 2, 0, 1, 2, 0, 1, 1, 0), ncol = 3)
cols <- c(1, 2, 2)

for (i in seq_len(ncol(B))) {
  A[, cols[i]] <- A[, cols[i]] + B[, i]
}
print(A)

我以为我可以在没有使用

的for循环的情况下编写它
A <- matrix(0, ncol = 4, nrow = 4)
B <- matrix(c(1, 0, 0, 0, 2, 0, 1, 2, 0, 1, 1, 0), ncol = 3)
cols <- c(1, 2, 2)

A[, cols] <- A[, cols] + B
print(A)

但是这不会返回相同的矩阵,因为它将第二列B添加到A的第二列,但是在下一步中将其替换为B的第三列,而不是将两个替换添加到一起。

我正在寻找一种快速通用的解决方案,它也适用于不同的索引向量和矩阵。

2 个答案:

答案 0 :(得分:0)

这并没有消除循环,但确实缩短了循环次数:

A <- matrix(0, ncol = 4, nrow = 4)
B <- matrix(c(1, 0, 0, 0, 2, 0, 1, 2, 0, 1, 1, 0), ncol = 3)
cols <- c(1, 2, 2)

for(i in unique(cols)){
  A[, i] <- A[, i] + apply(as.matrix(B[, cols == i]), 1, sum)
}
print(A)

答案 1 :(得分:0)

试试这个

ans = A[,cols] + B
ans = sapply(split(1:NCOL(ans), cols), function(i) rowSums(ans[, i, drop = FALSE]))
inds = cbind(rep(1:NROW(A), length(unique(cols))), rep(unique(cols), each = NROW(A)))
replace(A, inds, ans[inds])
#     [,1] [,2] [,3] [,4]
#[1,]    1    2    0    0
#[2,]    0    1    0    0
#[3,]    0    2    0    0
#[4,]    0    2    0    0