Re: [問題] 大筆data frame資料的處理

看板R_Language作者 (天)時間10年前 (2015/10/08 17:51), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/2 (看更多)
library(plyr) library(dplyr) library(data.table) library(magrittr) set.seed(10) tmp = llply(LETTERS[1:4], function(x) paste0(x, 1:40)) out = expand.grid(tmp[[1]], tmp[[2]], tmp[[3]], tmp[[4]]) %>% tbl_dt() out %<>% .[rep(1:nrow(.), sample(1:5, nrow(.), TRUE)), ] %>% mutate(Value = runif(nrow(.))) dim(out) # 7677529 5 s = proc.time() res = out %>% group_by(Var1, Var2, Var3, Var4) %>% summarise(num_rep = length(Value), value = mean(Value)) %>% filter(num_rep > 1) proc.time() - s # user system elapsed # 3.23 0.11 3.66 結論:七百六十七萬列 三秒 收工了 ※ 引述《Godkin (山裡的人)》之銘言: : [問題類型]: : : 效能諮詢(我想讓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), 來自: 180.218.154.163 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1444297906.A.0B6.html

10/08 19:17, , 1F
強大!! 感恩!!!
10/08 19:17, 1F
文章代碼(AID): #1M5Zoo2s (R_Language)
討論串 (同標題文章)
文章代碼(AID): #1M5Zoo2s (R_Language)