R中的apply()与sweep()

时间:2016-09-22 12:50:44

标签: r row apply

我写的是比较apply()和sweep()的注释,并发现了以下奇怪的差异。为了生成相同的结果,sweep()需要MARGIN = 1而apply需要MARGIN = 2.此外,指定矩阵的参数在apply()中是大写X,在sweep()中是小写。

my.matrix <- matrix(seq(1,9,1), nrow=3)
row.sums <- rowSums(my.matrix)
apply.matrix <- apply(X = my.matrix, MARGIN = 2, FUN = function (x) x/row.sums)
sweep.matrix <- sweep(x = my.matrix, MARGIN = 1, STATS = rowSums(my.matrix), FUN="/")
apply.matrix - sweep.matrix ##yup same matrix

扫描()不是“应用类型”功能吗?这只是另一个R怪癖还是让我失去理智?

1 个答案:

答案 0 :(得分:4)

请注意apply

  

如果对'FUN'的每次调用都返回一个长度为'n'的向量,那么'apply'将返回一个维度为'c(n,dim(X)[MARGIN])'的数组,如果'n&gt; 1’

在您的示例中,MARGIN可以(并且应该)在两种情况下都设置为1;但是apply的返回值应该被转置。如果原始矩阵不是正方形,这是最容易看到的:

my.matrix <- matrix(seq(1,12,1), nrow=4)
apply.matrix <- t(apply(X = my.matrix, MARGIN = 1, FUN = function(x) x/sum(x)))
sweep.matrix <- sweep(x = my.matrix, MARGIN = 1, STATS = rowSums(my.matrix), FUN="/")
all.equal(apply.matrix, sweep.matrix)
# [1] TRUE

另见Can you implement 'sweep' using apply in R?的答案,其内容完全相同。