看板 R_Language 關於我們 聯絡資訊
[問題類型]: 效能諮詢(我想讓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
koai:如果只有一個變數的話,sapply是可以取代你的for的! 你可以試 12/02 13:20
koai:下面這個例子 sapply(1:10,function(x){x^2}) 12/02 13:21
onionsteven:恩 這裡就是我求救的地方 我的變數有三個 XD 12/02 13:22
koai:在你的問題裡面, 應該是先算完idx <- f(a1,a2,a3)的值(向量) 12/02 13:22
koai:然後用 sapply(idx,function(x){...}) 12/02 13:23
koai:這樣子不知道有沒有幫到你... @@" 12/02 13:24
koai:如果還有問題,也許可以試著給一點範例資料,幫你做看看! 12/02 13:25
onionsteven:我試看看 @@ 謝謝 12/02 13:33
koai:sapply(1:10000,function(x){g(data[x,])}),g(*)你可以自己寫 12/02 13:40
koai:這應該是你想要做的事吧? @@" 12/02 13:40
obarisk:apply比for快...實驗看看吧!比較美倒是真的! 12/02 13:42
obarisk:注意到x是個物件,所以他不是一個值 12/02 13:44
Yukirin:apply族的函數本質不也就是for loop嗎 記得不會比較快 12/02 13:58
onionsteven:那如果我希望改進for迴圈的執行速度 能用甚麼樣的寫法 12/02 14:00
koai:vectorize... eg.N=1000000; data=matrix(rnorm(3*N),N,3) 12/02 14:29
koai:system.time( sapply(1:N,function(x){ data[x,1]^data[x,2]/ 12/02 14:30
koai:data[x,3] }) ); 12/02 14:31
koai:system.time(for(x in 1:N){data[x,1]^data[x,2]/data[x,3]}) 12/02 14:31
koai:system.time( test <- data[,1]^data[,2]/data[,3] ) 12/02 14:32
koai:你可以比較一下上面例子分別需要多少時間!! 12/02 14:32
onionsteven:好的 謝謝 12/02 14:49
gsuper:不要思考怎麼躲避回圈 應該要思考怎麼安排記憶體 12/02 17:04
gsuper:比方說暫時用不到的的變數移除等 12/02 17:05
onionsteven:請問意思是 執行的時候 變數越少越好嗎? 12/02 17:33
Wush978:除了vectorize之外都沒有什麼好語法可以顯著提升速度 12/02 21:50
Wush978:但是透過電腦的硬體和適當的R 套件,可以顯著提升速度 12/02 21:51
Wush978:但是這個是case by case 的狀況,所以建議可以詳細給code 12/02 21:51