R 中应用函数中的边距参数

Ada*_*dam 5 r margin multiplication apply

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

matrix <- matrix(1:10)
vector <- c(10:19)
t(apply(matrix,2,'*',vector))
Run Code Online (Sandbox Code Playgroud)

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

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]   10   22   36   52   70   90  112  136  162   190
Run Code Online (Sandbox Code Playgroud)

但是如果我改变 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
Run Code Online (Sandbox Code Playgroud)

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

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

Sab*_*DeM 2

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

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

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

当对两个向量应用要求它们具有相同长度的运算时,R 会自动循环或重复较短的向量,直到它足够长以匹配较长的向量

几天前有一个关于向量化和函数行为的非常类似的讨论,您可以在这里==找到它。

回到你的问题,让我们不考虑整个 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
Run Code Online (Sandbox Code Playgroud)

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

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