那是个好问题!使用文档记录的 dplyr
语法似乎没有简单的方法来实现它,但是有没有类似于以下的解决方法?
sampleGroup<-function(df,x=1){
df[
unlist(lapply(attr((df),"indices"),function(r)sample(r,min(length(r),x))))
,]
}
sampleGroup(iris %.% group_by(Species),3)
编辑 - 性能比较
下面是一项测试,针对100万行、26个组,使用data.table(包括本地和按照示例进行函数调用的方式)。
本地data.table的速度约为dplyr解决方法的两倍,也比带有调用输出的data.table调用要快。因此,dplyr/data.table的性能大致相同。
希望dplyr团队能够尽快为我们提供一些本地语法来进行抽样!(或者更好的是,也许已经有了)
sampleGroup.dt<-function(df,size) {
df[sample(nrow(df),size=size),]
}
testdata<-data.frame(group=sample(letters,10e5,T),runif(10e5))
dti<-data.table(testdata)
system.time(sampleGroup(testdata %.% group_by(group),10))
system.time(dti[dti[,list(val=sample(.I,10)),by="group"]$val])
system.time(dti[, sampleGroup.dt(dti, 10), by=group])
iris %.% group_by(Species) %.% sampleGroup(size = 10)
呢? - dickoasystem.time(rbind_all(do(testdata %.% group_by(group),function(x) sampleGroup(x,10))))
@Troy的dplyr解决方案更快。 - Robert