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