[問題] 如何減少使用for

看板R_Language作者 (.__ . )時間11年前 (2013/12/02 12:03), 編輯推噓3(3024)
留言27則, 6人參與, 最新討論串1/1
[問題類型]: 效能諮詢(我想讓R 跑更快) [軟體熟悉度]: 使用者(已經有用R 做過不少作品) [問題敘述]: 正在做分析 想讓執行速度加快 我的語法用了三層的for迴圈 想請問能不能避開 資料存放在多個檔案夾中 所以第一個迴圈是改變資料讀取路徑跟檔名 第二個迴圈是模擬資料的10000筆 依序做計算 第三個迴圈是針對每筆數據給予某定值做計算 約有2000組 apply或是sapply的執行速度比for快 但是使用它來計算某個函數時 我希望能指定不同的參數位置 [程式範例]: 例如:10000筆的模擬資料中 每一筆有三個 假定每筆資料為a1 a2 a3 data=matrix(rnorm(30000,0,1),10000,3) apply(data,1,mean)可以計算a1 a2 a3的mean 但是我想做的是另外自己寫的函數 可能是a1^a2/a3 這部分有哪個語法能夠取代for迴圈呢 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.76.107

12/02 13:20, , 1F
如果只有一個變數的話,sapply是可以取代你的for的! 你可以試
12/02 13:20, 1F

12/02 13:21, , 2F
下面這個例子 sapply(1:10,function(x){x^2})
12/02 13:21, 2F

12/02 13:22, , 3F
恩 這裡就是我求救的地方 我的變數有三個 XD
12/02 13:22, 3F

12/02 13:22, , 4F
在你的問題裡面, 應該是先算完idx <- f(a1,a2,a3)的值(向量)
12/02 13:22, 4F

12/02 13:23, , 5F
然後用 sapply(idx,function(x){...})
12/02 13:23, 5F

12/02 13:24, , 6F
這樣子不知道有沒有幫到你... @@"
12/02 13:24, 6F

12/02 13:25, , 7F
如果還有問題,也許可以試著給一點範例資料,幫你做看看!
12/02 13:25, 7F

12/02 13:33, , 8F
我試看看 @@ 謝謝
12/02 13:33, 8F

12/02 13:40, , 9F
sapply(1:10000,function(x){g(data[x,])}),g(*)你可以自己寫
12/02 13:40, 9F

12/02 13:40, , 10F
這應該是你想要做的事吧? @@"
12/02 13:40, 10F

12/02 13:42, , 11F
apply比for快...實驗看看吧!比較美倒是真的!
12/02 13:42, 11F

12/02 13:44, , 12F
注意到x是個物件,所以他不是一個值
12/02 13:44, 12F

12/02 13:58, , 13F
apply族的函數本質不也就是for loop嗎 記得不會比較快
12/02 13:58, 13F

12/02 14:00, , 14F
那如果我希望改進for迴圈的執行速度 能用甚麼樣的寫法
12/02 14:00, 14F

12/02 14:29, , 15F
vectorize... eg.N=1000000; data=matrix(rnorm(3*N),N,3)
12/02 14:29, 15F

12/02 14:30, , 16F
system.time( sapply(1:N,function(x){ data[x,1]^data[x,2]/
12/02 14:30, 16F

12/02 14:31, , 17F
data[x,3] }) );
12/02 14:31, 17F

12/02 14:31, , 18F
system.time(for(x in 1:N){data[x,1]^data[x,2]/data[x,3]})
12/02 14:31, 18F

12/02 14:32, , 19F
system.time( test <- data[,1]^data[,2]/data[,3] )
12/02 14:32, 19F

12/02 14:32, , 20F
你可以比較一下上面例子分別需要多少時間!!
12/02 14:32, 20F

12/02 14:49, , 21F
好的 謝謝
12/02 14:49, 21F

12/02 17:04, , 22F
不要思考怎麼躲避回圈 應該要思考怎麼安排記憶體
12/02 17:04, 22F

12/02 17:05, , 23F
比方說暫時用不到的的變數移除等
12/02 17:05, 23F

12/02 17:33, , 24F
請問意思是 執行的時候 變數越少越好嗎?
12/02 17:33, 24F

12/02 21:50, , 25F
除了vectorize之外都沒有什麼好語法可以顯著提升速度
12/02 21:50, 25F

12/02 21:51, , 26F
但是透過電腦的硬體和適當的R 套件,可以顯著提升速度
12/02 21:51, 26F

12/02 21:51, , 27F
但是這個是case by case 的狀況,所以建議可以詳細給code
12/02 21:51, 27F
文章代碼(AID): #1Id0PznW (R_Language)
文章代碼(AID): #1Id0PznW (R_Language)