Фрейм данных R, выборка с заменой при контроле двух переменных

У меня есть следующий фрейм данных в R с тремя переменными:

id<-c(1,2,3,4,5,6,7,8,9,10)
frequency<-c(1,2,3,4,5,6,7,8,9,10)
male<-c(1,0,1,0,1,0,1,0,1,0)
df<-data.frame(id,frequency,male)

Для df среднее значение frequency равно 5,5, а 50% наблюдений составляют male. Теперь я хочу взять случайную выборку с заменой из df и с тем же размером, в то время как среднее значение frequency новой выборки равно 4, а пропорция male остается постоянной. Интересно, есть ли способ сделать это в R.

Заранее спасибо.


person AliCivil    schedule 06.04.2015    source источник


Ответы (1)


Я не могу найти какую-либо конкретную функцию для того, что вы хотите. Но это даст желаемый результат. Комбинация «повторить» и функция if играют ту же роль, что и цикл while, а другие линейные средства делают размер выборки равным 4.

repeat
{
    df.sample = df[sample(nrow(df),size=4,replace=FALSE),]
    if(mean(df.sample$frequency) == 4.5 & mean(df.sample$male) == 0.5){
        break
    }
}

Результаты

> df.sample
  id frequency male
   4  4         4    0
   2  2         2    0
   9  9         9    1
   3  3         3    1

Для цикла while,

while(!(mean(df.sample$frequency) == 4.5 & mean(df.sample$male) == 0.5)){
    df.sample = df[sample(nrow(df),size=4,replace=FALSE),]
}
person asbebe    schedule 06.04.2015
comment
Спасибо. Только одно: я считаю, что «заменить» должно быть = ИСТИНА, а «размер» = 10, чтобы точно ответить на вопрос выше. - person AliCivil; 06.04.2015
comment
Если вы измените «size = 4, replace = FALSE» на «size = 10, replace = TRUE», вы можете получить результат с 10 строками, среднее (частота) = 4,5 и среднее (мужское) = 0,5. - person asbebe; 07.04.2015
comment
Я только что проверил код на своем наборе данных из 100 000 записей, и он не работает. кажется, что циклическое решение подходит только для небольшого количества записей и не может решить проблему, когда у нас есть, например, 100 000 записей. Какие-нибудь мысли? - person AliCivil; 19.04.2015
comment
Это решение может занять много времени для большого набора данных и количества размеров выборки. Или нет подходящего образца, если вы установите replace = FALSE вместо replace = TRUE. Вы проверяли перед тестированием кода? - person asbebe; 20.04.2015