R中apply函数内的Margin参数

时间:2015-07-04 02:10:06

标签: r margin apply multiplication

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

 apply(dat, 2, function(x) x / sum(x))
                 A          B
Sample1 0.02222222 0.07936508
Sample2 0.04444444 0.08730159
Sample3 0.06666667 0.09523810
Sample4 0.08888889 0.10317460
Sample5 0.11111111 0.11111111
Sample6 0.13333333 0.11904762
Sample7 0.15555556 0.12698413
Sample8 0.17777778 0.13492063
Sample9 0.20000000 0.14285714

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

## Make color a factor
abc$color <- as.factor(abc$color)  # "blue"  "red"   "white"

## Using desc to reverse order in aes
ggplot() + geom_histogram(data = abc, aes(x=num, fill = color, order=desc(color)),
                          position = "identity") + scale_fill_identity()

## Manually reorder factors
abc$color <- with(abc, factor(color, levels(abc$color)[3:1]))
ggplot() + geom_histogram(data = abc, aes(x=num, fill = color),
                          position = "identity") + scale_fill_identity()

但如果我改变MARGIN = 2,我得到这个结果:

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

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

有人可以向我解释确切的区别是什么吗?

1 个答案:

答案 0 :(得分:2)

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

当您设置MARGIN = 1时,您要对R使用名为vector的向量乘以矩阵的每一行。由于矢量化,即使您的原始结果只是一行元素,您也会得到10个元素。

原因在于,使用诺曼·马特洛夫(Norman Matloff)的优秀作品&#34; R编程艺术&#34;:

  

将操作应用于需要它们的两个向量时   相同的长度,R自动回收或重复较短的,   直到它足够长以匹配较长的

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

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

 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])并与vector相乘但由于vector较长,因此R采用较短的向量并回收它&#34; n&#34;时间越长越好,在这种情况下10次。

当然,我们只有一个案例。 apply函数为每一行执行此步骤,即十行。结果我们得到一个10 x 10的矩阵。