作者Godkin (山裡的人)
看板R_Language
標題[問題] 大筆data frame資料的處理
時間Thu Oct 8 17:15:26 2015
[問題類型]:
效能諮詢(我想讓R 跑更快)
[軟體熟悉度]:
請把以下不需要的部份刪除
使用者(已經有用R 做過不少作品)
[問題敘述]:
將data frame當中重複出現二次以上的資料抓出,並求取某個欄位的平均值
我有一個含有接近四百萬比資料的data frame, 格式大概長這個樣子
ID1 ID2 Name1 Name2 Value
-------------------------------------
m001 g001 mm1 gg1 0.5
m001 g001 mm1 gg1 0.6
m002 g001 mm2 gg1 0.3
m002 g002 mm2 gg2 0.5
m002 g002 mm2 gg2 0.7
m002 g002 mm2 gg2 0.2
m003 g002 mm3 gg2 0.1
.... .... .... ... ...
------------------------------------
我想把當中重複出現二次以上的資料抓出來,並計算value欄位的平均
使得資料變成下面這個樣子
ID1 ID2 Name1 Name2 Value
-------------------------------------
m001 g001 mm1 gg1 0.55
m002 g002 mm2 gg2 0.47
.... .... .... .... ....
-------------------------------------
用過for loop + aggregate, foreach + doParallel以及用Rcpp寫for loop
的方式去處理過,但是實在是相當慢,foreach+doParallel跟Rcpp for的版本
幾乎都跑了接近快12小時, 不知道版上的各位大大有沒有什麼好的建議?
[環境敘述]:
請提供 sessionInfo() 的輸出結果,
裡面含有所有你使用的作業系統、R 的版本和套件版本資訊,
讓版友更容易找出錯誤
[關鍵字]:
data frame, subsetting
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.215.230
※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1444295729.A.DD1.html
※ 編輯: Godkin (140.116.215.230), 10/08/2015 17:16:36
→ celestialgod: 有試過直接dplyr嗎 10/08 17:21
→ celestialgod: dat %>% group_by(ID1, ID2, Name1, Name2) %>% 10/08 17:22
→ celestialgod: summarise(value = mean(Value)) 10/08 17:22
→ Godkin: 有,但就是卡了個要撈出出現兩次以上的資料,還是跑挺久的 10/08 17:30
→ Godkin: 現在用foreach+doParallel+aggregate+dplyr有比較快了 10/08 17:33
推 celestialgod: summarise直接上length(value)做篩選就好啦 10/08 17:35
→ celestialgod: 晚一點來測試速度 10/08 17:35
推 celestialgod: 如果四百萬列就要12小時,真的有點誇張 10/08 17:36
→ Godkin: 沒過用length XD, 等等來試試 10/08 17:36
→ andrew43: 我直覺想到先把字串接起來變成新的欄再說... 10/08 18:10