2016-08-16 8 views
1

Я пробовал bootstraping с dplyr, и я застрял с простой строкой кода.R - dplyr bootstrap несколько переменных

Используя функцию bootstrap, я нашел out, что можно сделать

library(dplyr) 
library(broom) 

mtcars %>% bootstrap(10) %>% 
    do(tidy(sample(.$cyl, 2))) 

, чтобы получить хороший несложных OUTPUT

replicate  x 
     (int) (dbl) 
1   1  6 
2   1  8 
3   2  6 
4   2  8 
... 

Однако, было бы неплохо, чтобы получить больше переменных (столбцы), но я не могу понять, как это сделать.

Я думал, что-то вроде

mtcars %>% bootstrap(10) %>% 
    do(tidy(sample(., 2))) 

или

mtcars %>% bootstrap(10) %>% 
    do(tidy(sample_n(2))) 

будет работать, но это не так.

Любая подсказка, как я могу подмножать несколько переменных?

Представьте себе, я хочу, чтобы получить mpg, cyl и disp, чтобы получить что-то вроде (выхода)

replicate cyl mpg disp 
     (int) (dbl) 
1   1  6 21 ... 
2   1  4 22 ... 
3   2  6 ... 
4   2  8 ... 
... 

(я случайно выбираю два случая sample = 2 и повторяет эту процедуру (bootstrap) 10 раз).

+0

Ваша цель просто получить кучу случайных выборок с заменой _ для каждого столбца_ в исходном фрейме данных? Какова модель, которую вы в конечном итоге пытаетесь уместить? Есть еще несколько примеров при загрузке с метлой в [загрузочной виньетке] (https://github.com/dgrtwo/broom/blob/master/vignettes/bootstrapping.Rmd), которая может быть полезна. –

+0

@ Крит, спасибо, я посмотрю. Это не соответствует модели, а просто манипулирует данными. Кто бы ни проголосовал, могу ли я получить объяснение? спасибо – giacomo

ответ

3

Использование

set.seed(123) 
sapply(mtcars, function(v) sample(v,2)) 

вы можете попробовать 2 значения из каждого столбца mtcars, где, однако столбцы отобранного независимо друг от друга (не уверен, что это то, что вы хотите и/или что она делает смысл). Поэтому решение с использованием broom может быть:

mtcars %>% 
    bootstrap(10) %>% 
    do(tidy(sapply(., function(v) sample(v,2)))) 

Если, с другой стороны, сохраняя отношения между столбцами имеет важное значение, вы можете использовать что-то вроде

do.call("rbind",lapply(1:10, function(dum) mtcars[sample.int(nrow(mtcars), 2), ])) 
+0

спасибо! очень полезно. – giacomo