Re: [問題] 大筆data frame資料的處理
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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
R_Language 近期熱門文章
PTT數位生活區 即時熱門文章