作者celestialgod (天)
看板R_Language
标题Re: [问题] 大笔data frame资料的处理
时间Thu Oct 8 17:51:44 2015
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://webptt.com/cn.aspx?n=bbs/R_Language/M.1444297906.A.0B6.html
1F:推 Godkin: 强大!! 感恩!!! 10/08 19:17