gpt4 book ai didi

r - R 中 apply 函数中的 Margin 参数

转载 作者:行者123 更新时间:2023-12-01 18:16:29 24 4
gpt4 key购买 nike

这个问题更多的是关于 apply 函数中的 MARGIN 参数。假设我想将以下矩阵乘以以下向量,以便将第一个矩阵元素乘以第一个向量元素,然后将第二个矩阵元素乘以第二个向量元素,依此类推。我使用以下代码:

matrix <- matrix(1:10)
vector <- c(10:19)
t(apply(matrix,2,'*',vector))

它返回一个非常干净的结果:

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 10 22 36 52 70 90 112 136 162 190

但是如果我更改 MARGIN = 2,我会得到以下结果:

matrix <- matrix(1:10)
vector <- c(10:19)
t(apply(matrix,1,'*',vector))

[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 10 11 12 13 14 15 16 17 18 19
[2,] 20 22 24 26 28 30 32 34 36 38
[3,] 30 33 36 39 42 45 48 51 54 57
[4,] 40 44 48 52 56 60 64 68 72 76
[5,] 50 55 60 65 70 75 80 85 90 95
[6,] 60 66 72 78 84 90 96 102 108 114
[7,] 70 77 84 91 98 105 112 119 126 133
[8,] 80 88 96 104 112 120 128 136 144 152
[9,] 90 99 108 117 126 135 144 153 162 171
[10,] 100 110 120 130 140 150 160 170 180 190

我想如果 MARGIN = 1,第一个矩阵行将乘以每个向量元素,然后是第二个矩阵行,依此类推,而 MARGIN = 2 只是将第一个矩阵行乘以第一个向量元素?

有人可以向我解释一下到底有什么区别吗?

最佳答案

应用函数的边距可以用维度来解释:1 = 行,2 = 列。

当您设置 MARGIN = 1 时,您是在告诉 R 将矩阵的每一行与名为 vector 的向量相乘。由于矢量化,即使您的原始结果是一行只有一个元素,您也会得到 10 个元素。

原因是,借用诺曼·马特洛夫(Norman Matloff)在《R 编程的艺术》这本优秀著作中的话:

When applying an operation to two vectors that requires them to be the same length, R automatically recycles, or repeats, the shorter one, until it is long enough to match the longer one

几天前有一个关于向量化和 == 函数行为的非常类似的讨论,你可以找到它 here .

回到你的问题,让我们不考虑整个 apply 函数,而只考虑它的一次迭代,比如矩阵的第一个元素与向量相乘。我们有:

 matrix[1]
[1] 1
vector
[1] 10 11 12 13 14 15 16 17 18 19
matrix[1] * vector
[1] 10 11 12 13 14 15 16 17 18 19

正如我引用的书中所述,R 采用较短的向量(在本例中为matrix[1])并与向量相乘,但是因为向量 较长,R 采用较短的向量并将其回收“n”次,与较长的向量一样,在本例中为 10 次。

当然,我们只遇到了一种情况。 apply 函数对每一行执行此步骤,共十行。结果我们得到一个 10 x 10 的矩阵。

关于r - R 中 apply 函数中的 Margin 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31216188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com