Выборка маленького фрейма данных из большого фрейма данных - PullRequest
3 голосов
/ 28 марта 2012

Я пытаюсь выбрать фрейм данных из данного фрейма данных так, чтобы было достаточно выборок на каждом из уровней переменной.Это может быть достигнуто путем отделения кадра данных по уровням и выборке от каждого из них.Я думал, что ddply (фрейм данных в фрейм данных) сделает это для меня.Взяв минимальный пример:

set.seed(1)
data1 <-data.frame(a=sample(c('B0','B1','B2'),100,replace=TRUE),b=rnorm(100),c=runif(100))
> summary(data1$a)
B0 B1 B2 
30 32 38

Следующие команды выполняют выборку ...

Когда я вхожу ...

data2 <- ddply(data1,c('a'),function(x) sample(x,20,replace=FALSE))

Я получаю следующую ошибку

   Error in `[.data.frame`(x, .Internal(sample(length(x), size, replace,  : 
  cannot take a sample larger than the population when 'replace = FALSE'

Эта ошибка связана с тем, что x внутри функции ddply является не вектором, а фреймом данных.

Кто-нибудь знает, как добиться этой выборки?Я знаю, что один из способов - не использовать ddply, а просто выполнить (1) сегрегацию, (2) выборку и (3) сопоставление в три этапа.Но мне было интересно каким-то образом ... с базовыми или plyr функциями ...

Спасибо за помощь ...

Ответы [ 2 ]

5 голосов
/ 28 марта 2012

Я думаю, что вы хотите поднастроить фрейм данных, переданный в x, используя sample:

ddply(data1,.(a),function(x) x[sample(nrow(x),20,replace = FALSE),])

Но, конечно, вам все равно нужно позаботиться о том, чтобы размер выборкидля каждой части (в данном случае 20), по крайней мере, такой же большой, как наименьшее подмножество ваших данных на основе уровней a.

3 голосов
/ 28 марта 2012

Казалось бы, если вы хотите выбрать категорию, которая содержит менее 20 строк, вам нужно заменить = TRUE ...

Это может помочь:

ddply(data1,'a',function(x) x[sample.int(NROW(x),20,replace=TRUE),])
...