Это хороший вопрос! Невозможно увидеть простой способ сделать это с документированным синтаксисом для 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)
#Source: local data frame [9 x 5]
#Groups: Species
#
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#39 4.4 3.0 1.3 0.2 setosa
#16 5.7 4.4 1.5 0.4 setosa
#25 4.8 3.4 1.9 0.2 setosa
#51 7.0 3.2 4.7 1.4 versicolor
#62 5.9 3.0 4.2 1.5 versicolor
#59 6.6 2.9 4.6 1.3 versicolor
#148 6.5 3.0 5.2 2.0 virginica
#103 7.1 3.0 5.9 2.1 virginica
#120 6.0 2.2 5.0 1.5 virginica
РЕДАКТИРОВАТЬ - Сравнение производительности
Вот тест против использования data.table (как родные и с вызовом функции, как в приведенном примере) для 1х строк, 26 групп.
Собственная таблица данных примерно в 2 раза быстрее, чем обходной путь 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)
# using the dplyr workaround with external function call
system.time(sampleGroup(testdata %.% group_by(group),10))
#user system elapsed
#0.07 0.00 0.06
#using native data.table
system.time(dti[dti[,list(val=sample(.I,10)),by="group"]$val])
#user system elapsed
#0.04 0.00 0.03
#using data.table with external function call
system.time(dti[, sampleGroup.dt(dti, 10), by=group])
#user system elapsed
#0.06 0.02 0.08
вот ссылка на введение dplyr. http://rpubs.com/hadley/dplyr-intro – marbel
Спасибо, но я думаю, что решение этой проблемы еще не содержится в документации. Хорошее решение с data.table! – Robert
Почему бы просто не использовать 'iris%.% group_by (Species)%.% sampleGroup (size = 10) ' – dickoa