我在编写笔记以比较apply()和scan()时发现了以下奇怪的区别。为了产生相同的结果,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
Run Code Online (Sandbox Code Playgroud)
slip()不是“应用类型”函数吗?这是另一个R怪癖还是我迷失了方向?
请注意apply,
如果每次对“ FUN”的调用都返回一个长度为“ n”的向量,那么如果“ n> 1”,则“ apply”将返回一个尺寸为“ c(n,dim(X)[MARGIN])”的数组
在您的示例中,在两种情况下都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
Run Code Online (Sandbox Code Playgroud)
另请参见以下答案:可以在R中使用Apply来实现“扫描”吗?,它说的差不多。