2016-09-22 97 views
1

我在寫筆記來比較apply()和sweep(),發現了以下奇怪的差異。爲了生成相同的結果,sweep()在應用想要的MARGIN = 2時需要MARGIN = 1。另外,指定矩陣的參數是apply()中的大寫X,而sweep()中的小寫。apply()vs. sweep()in R

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的怪癖,還是我失去了主意?

+0

你的問題是什麼,即閱讀文檔後究竟有什麼不清楚? – Roland

+0

問題:對於同樣的問題,兩個緊密相關的函數確實有不同的語法嗎? –

+0

請注意,R已經開發了很長時間,R-Core非常注意不要破壞現有的代碼。這兩種功能都可能是S的遺留問題,並且與S/S-PLUS的兼容性在早期非常值得關注。 – Roland

回答

2

注意,對於apply

如果每次調用 'FUN' 返回長度的矢量 'N',那麼 '應用' 返回尺寸c(N,暗淡(X的」的陣列) MARGIN])」如果 'N> 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?,它說大同小異的事情。