R根据另一个矩阵/数据帧修改矩阵/数据帧的区域

时间:2011-09-21 12:56:02

标签: r matrix dataframe

我有一个关于修改矩阵的问题。我已设法根据值更改矩阵中的值 当它们具有相同尺寸时的另一个矩阵。但现在我需要将此过程应用于矩阵 不同的尺寸。换句话说,我想对一个"区域应用一些更改"取决于更大的矩阵 关于较小的值的值,请记住我知道较小矩阵的位置 更大的。

假设这是矩阵A

1 2 3 4 5 6 7 8 
1 2 3 4 5 6 7 8 
1 2 3 4 5 6 7 8 
1 2 3 4 5 6 7 8 
1 2 3 4 5 6 7 8 

和B

 0 0 0 0 0 0 
 0 1 1 1 1 0 
 0 0 1 1 1 0 
 0 0 1 1 0 0 
 0 0 0 0 0 0 

我知道B [1,1]是我必须检查修改A [2,1]的值,B [2,1]代表A [3,1]等等......

我正在寻找的最终结果是

1 2 3 4 5 6 7 8 
1 2 0 0 0 0 7 8 
1 2 3 0 0 0 7 8 
1 2 3 0 0 6 7 8 
1 2 3 4 5 6 7 8 

对于A值替换,我在原始脚本中使用for循环

  

for(i in 1:10)A [B == i] = 0

在A和B具有相同尺寸时有效。

如何在矩阵A中进行替换?应用?一个for循环?

任何帮助都会受到赞赏,当然你可以给我指点一些我还没读过的基本读物。

1 个答案:

答案 0 :(得分:2)

只需选择子矩阵并执行您想要的操作,即:

A[1:5,2:8][B == 1] = 0

或者,通常,如果[row,col]是矩阵A中矩阵B的起始位置:

A[row:nrow(A),col:ncol(A)][B == 1] = 0

以下是测试代码,以便您检查它是否有效:

A = matrix(rep(1:8, each = 5), nrow = 5)
B = matrix(c(rep(0, 7), 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, rep(0, 8)), nrow = 5, byrow = TRUE)
A[1:5,2:8][B == 1] = 0

感谢Andrie ho for hinting me the ncol function而不是丑陋的昏暗(A)[2] ......