如何将向量添加到 R 中矩阵的每一列?
How to add a vector to each column in a matrix in R?
我有一个名为 r2 的矩阵,对于该矩阵的每一列,我需要添加另一列数据 - 即。我希望结果是第一列的第一个元素+第二列的第一个元素;第二个元素+第二个元素;等等。当我分离一列并添加它时,我可以让它工作,但我不能遍历矩阵的列。见下文:
这是矩阵 r2:
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 51.032 45.480 42.638 59.808 40.309 51.135
[2,] 50.591 45.415 47.962 57.020 39.670 52.518
[3,] 55.695 50.099 50.205 63.256 45.174 50.475
[4,] 46.422 44.233 44.322 53.229 34.943 41.707
[5,] 52.357 44.523 44.374 57.014 41.672 53.920
[6,] 53.610 44.448 41.846 60.451 42.163 52.706
[7,] 51.728 44.612 43.305 56.844 39.048 48.710
[8,] 52.790 45.266 43.426 58.365 41.577 54.630
这是我要添加到矩阵每一列的列,称为 BDtool["Constant"]:
-26.701
-29.287
-30.964
-24.246
-29.194
-30.444
-26.524
-29.771
此代码用于将 r2 列添加到 Constant 列:
r3 <- r2[,1]+BDtool["Constant"]
结果如下:
[1,] 24.434
[2,] 23.231
[3,] 19.511
[4,] 17.461
[5,] 24.726
[6,] 22.262
[7,] 22.186
[8,] 24.859
这正是我想要的。但是,我无法使用任何类型的 for 循环。我只想遍历 r2 中的每一列,并为每一列获得与上面类似的输出。我摆弄过各种版本的:
r3 <- for (i in r2[,1:6]) {
i +BDtool["Constant"]
}
但 r3 总是以 NULL 结尾。我如何使这项工作?感谢您提供任何建议!
一种方法是使用辅助矩阵。假设你有
> M <- matrix(1:9,3,3); M
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
>
并且您想向每一列添加一个向量 c(1,2,3)
。好吧,我们可以创建一个矩阵并将其与该向量相乘:
> idV <- matrix(1,3,3) * c(1,2,3); idV
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 2 2
[3,] 3 3 3
>
之后我们只需将两个矩阵相加:
> M + idV
[,1] [,2] [,3]
[1,] 2 5 8
[2,] 4 7 10
[3,] 6 9 12
>
您可以在辅助函数中轻松设置它。
编辑: 但正如 Ronan 在上面的回答中提醒我们的那样,回收规则使它变得自动。
您可以使用r3 <- r2 + BDtool$Constant
这是因为 R 的回收 属性。 BDtool$Constant
首先添加到 r2
矩阵的第一列,BDtool$Constant
中的值被回收并再次用于第二列,依此类推所有其他列。
这个简化的例子可能有助于阐明 -
r2 <- matrix(1:18, 6, 3)
v <- 1:6
r2 + v
# [,1] [,2] [,3]
#[1,] 2 8 14
#[2,] 4 10 16
#[3,] 6 12 18
#[4,] 8 14 20
#[5,] 10 16 22
#[6,] 12 18 24
我有一个名为 r2 的矩阵,对于该矩阵的每一列,我需要添加另一列数据 - 即。我希望结果是第一列的第一个元素+第二列的第一个元素;第二个元素+第二个元素;等等。当我分离一列并添加它时,我可以让它工作,但我不能遍历矩阵的列。见下文:
这是矩阵 r2:
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 51.032 45.480 42.638 59.808 40.309 51.135
[2,] 50.591 45.415 47.962 57.020 39.670 52.518
[3,] 55.695 50.099 50.205 63.256 45.174 50.475
[4,] 46.422 44.233 44.322 53.229 34.943 41.707
[5,] 52.357 44.523 44.374 57.014 41.672 53.920
[6,] 53.610 44.448 41.846 60.451 42.163 52.706
[7,] 51.728 44.612 43.305 56.844 39.048 48.710
[8,] 52.790 45.266 43.426 58.365 41.577 54.630
这是我要添加到矩阵每一列的列,称为 BDtool["Constant"]:
-26.701
-29.287
-30.964
-24.246
-29.194
-30.444
-26.524
-29.771
此代码用于将 r2 列添加到 Constant 列:
r3 <- r2[,1]+BDtool["Constant"]
结果如下:
[1,] 24.434
[2,] 23.231
[3,] 19.511
[4,] 17.461
[5,] 24.726
[6,] 22.262
[7,] 22.186
[8,] 24.859
这正是我想要的。但是,我无法使用任何类型的 for 循环。我只想遍历 r2 中的每一列,并为每一列获得与上面类似的输出。我摆弄过各种版本的:
r3 <- for (i in r2[,1:6]) {
i +BDtool["Constant"]
}
但 r3 总是以 NULL 结尾。我如何使这项工作?感谢您提供任何建议!
一种方法是使用辅助矩阵。假设你有
> M <- matrix(1:9,3,3); M
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
>
并且您想向每一列添加一个向量 c(1,2,3)
。好吧,我们可以创建一个矩阵并将其与该向量相乘:
> idV <- matrix(1,3,3) * c(1,2,3); idV
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 2 2
[3,] 3 3 3
>
之后我们只需将两个矩阵相加:
> M + idV
[,1] [,2] [,3]
[1,] 2 5 8
[2,] 4 7 10
[3,] 6 9 12
>
您可以在辅助函数中轻松设置它。
编辑: 但正如 Ronan 在上面的回答中提醒我们的那样,回收规则使它变得自动。
您可以使用r3 <- r2 + BDtool$Constant
这是因为 R 的回收 属性。 BDtool$Constant
首先添加到 r2
矩阵的第一列,BDtool$Constant
中的值被回收并再次用于第二列,依此类推所有其他列。
这个简化的例子可能有助于阐明 -
r2 <- matrix(1:18, 6, 3)
v <- 1:6
r2 + v
# [,1] [,2] [,3]
#[1,] 2 8 14
#[2,] 4 10 16
#[3,] 6 12 18
#[4,] 8 14 20
#[5,] 10 16 22
#[6,] 12 18 24