Re: [問題] 關於sweep function

看板R_Language作者 (天)時間10年前 (2015/09/10 17:06), 10年前編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
舉個例子 X = replicate(3, 1:5) # [,1] [,2] [,3] # [1,] 1 1 1 # [2,] 2 2 2 # [3,] 3 3 3 # [4,] 4 4 4 # [5,] 5 5 5 # 先看最簡單的例子,每一列乘上1:3 sweep(X, 2, 1:3, '*') # [,1] [,2] [,3] # [1,] 1 2 3 # [2,] 2 4 6 # [3,] 3 6 9 # [4,] 4 8 12 # [5,] 5 10 15 # 每一行乘上1:5 sweep(X, 1, 1:5, '*') # [,1] [,2] [,3] # [1,] 1 1 1 # [2,] 4 4 4 # [3,] 9 9 9 # [4,] 16 16 16 # [5,] 25 25 25 所以第一個input是一個矩陣 第二個input是控制你要做行運算還是做列運算 行運算是1,列運算是2 這裡跟apply的方向不同,要注意 第三個就根據第二個輸入對應長度的向量 像是第二個是1,第三個的向量長度就要跟 第一個input的每一行的長度相同(也就是跟列數相同) 第四個input是有兩個input的function 你如果用'+', '-', '*', '/'都是 a+b, a-b, a*b, a/b等等 你也可以自己輸入自己的函數,例如: sweep(X, 1, 1:5, function(a,b) a^2+a+b) # [,1] [,2] [,3] # [1,] 3 3 3 # [2,] 8 8 8 # [3,] 15 15 15 # [4,] 24 24 24 # [5,] 35 35 35 拿第一個例子來做解析 其實他就是在做這種事情: sweep(X, 2, 1:3, '*') == '*'(X, t(replicate(nrow(X), 1:3)) ) # [,1] [,2] [,3] # [1,] TRUE TRUE TRUE # [2,] TRUE TRUE TRUE # [3,] TRUE TRUE TRUE # [4,] TRUE TRUE TRUE # [5,] TRUE TRUE TRUE 其中的元素長這樣: t(replicate(nrow(X), 1:3)) # [,1] [,2] [,3] # [1,] 1 2 3 # [2,] 1 2 3 # [3,] 1 2 3 # [4,] 1 2 3 # [5,] 1 2 3 只是sweep比replicate這個方法有效率 ※ 引述《buzz20374 ()》之銘言: : 問題: 當你想要問問題時,請使用這個類別 : [問題類型]: : 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來) : [軟體熟悉度]: : 新手(沒寫過程式,R 是我的第一次) : [問題敘述]: : 在看 The R book 的 sweep function  : 最後面的例子我看不太懂 : sweep(matdata,1,1:10,function(a,b) b) : sweep(matdata,2,1:4,function(a,b) b) : http://i.imgur.com/d4brvD9.png
: function(a,b) b 代表甚麼意思呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.205.27.107 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1441876016.A.0CA.html ※ 編輯: celestialgod (123.205.27.107), 09/10/2015 17:10:37 ※ 編輯: celestialgod (123.205.27.107), 09/10/2015 17:17:32

09/10 17:33, , 1F
09/10 17:33, 1F
文章代碼(AID): #1LyKWm3A (R_Language)
文章代碼(AID): #1LyKWm3A (R_Language)