作者celestialgod (攸蓝)
看板R_Language
标题Re: [问题] 取样的问题
时间Mon May 4 18:41:57 2015
※ 引述《ardodo (米虫)》之铭言:
: 版上先进大家好,我有个问题想请教大家
: 现在我手上有笔某大专院校22个系所的学生资料(共1万笔)
: 我想要在每个系所各取样30名学生资料出来分析,请问该怎麽做?
: 我想到的方法是:每个系所subset一次、随机抽30名出来存成一个物件,重覆22次
: 最後将上面22个物件rbind即可
: 但是这样的做法很费时也没有效率,想请问有没有比较快的方法?
我生成一个简单的case示范
直接利用split这个功能做切割,再做合并,会很快
而pipe operator (magrittr:::%>%)就是为了避免储存太多暂存物件而设计
library(data.table)
library(dplyr)
library(magrittr)
nDepat = 22
nVar = 10
dat = replicate(nVar, rnorm(10000*nDepat)) %>% data.frame() %>%
mutate(department = rep(LETTERS[1:nDepat],,,10000)) %>% tbl_df()
nSubset = 30
dat2 = dat %>% split(.$department) %>% lapply(function(x){
x[sample(1:nrow(x), nSubset),]}) %>% do.call(rbind, .)
# %>% do.call(rbind, .) 跟 %>% rbindlist(.) 是一样的
# Another way by plyr
library(plyr)
dat3 = dat %>% plyr:::splitter_d(.(department)) %>% ldply(
function(x) x[sample(1:nrow(x), nSubset),])
# third way to do
dat4= dat %>% ddply(.(department), function(d) d[sample(1:nrow(d), nSubset),])
放上测试,我个人会比较喜欢第三种,简洁的程式。
library(rbenchmark)
benchmark(
method1 = dat %>% split(.$department) %>%
lapply(function(x) x[sample(1:nrow(x), nSubset),]) %>% do.call(rbind, .),
method2 = dat %>% plyr:::splitter_d(.(department)) %>% ldply(
function(x) x[sample(1:nrow(x), nSubset),])
method3 = dat %>% ddply(.(department), function(d){
d[sample(1:nrow(d), nSubset),]}),
replications = 30L,
columns = c("test", "replications", "user.self", "sys.self",
"elapsed", "relative"), order = "relative")
# test replications user.self sys.self elapsed relative
# 2 method2 30 2.64 0.03 2.93 1.000
# 3 method3 30 2.84 0.02 2.96 1.010
# 1 method1 30 2.90 0.17 3.12 1.065
至於用dplyr,我後来想到group_by做会比较麻烦,
要先新增变数,然後再用filter,不建议
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.205.27.107
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1430736119.A.E54.html
1F:→ obarisk: plyr 比较快? 05/04 18:46
我一开始以为splitter_d 会比 split快
後来发现是没仔细看,原文是
This is basically a thin wrapper around split which evaluates the variables
in the context of the data
应该splitter_d应该不会比较快多少,
至於 ldply 跟 lapply %>% do.call应该一样快
测试之後,速度差不了多少,看个人喜好吧
2F:推 psinqoo: 推 05/04 19:08
3F:推 psinqoo: 好像 能写成shinyapp 05/04 19:12
你可以试试看XDD
※ 编辑: celestialgod (123.205.27.107), 05/04/2015 19:18:00
4F:推 ardodo: 感谢cel大,我再试试看,谢谢 05/05 10:41