Начальная загрузка по нескольким группам в тидиверсе: rsample против метлы - PullRequest
2 голосов
/ 04 октября 2019

В этом вопросе SO начальной загрузке несколькими группами и подгруппами, казалось, было легко использовать функцию broom::bootstrap, указав аргумент by_group с TRUE.

Мой желаемый выводвложенный столбец с n строками, где столбец данных содержит загруженные данные, генерируемые каждым вызовом начальной загрузки (и каждая группа и подгруппа имеют такое же количество наблюдений, что и в исходных данных).

В broom я сделалследующее:

# packages
library(dplyr)
library(purrr)
library(tidyr)
library(tibble)
library(rsample)
library(broom)

# some data to bootstrap
set.seed(123)
data <- tibble(
  group=rep(c('group1','group2','group3','group4'), 25),
  subgroup=rep(c('subgroup1','subgroup2','subgroup3','subgroup4'), 25),
  v1=rnorm(100),
  v2=rnorm(100)
)

# the actual approach using broom::bootstrap
tibble(id = 1:100) %>% 
  mutate(data = map(id, ~ {data %>%
      group_by(group,subgroup) %>% 
      broom::bootstrap(10, by_group=TRUE)}))

Поскольку функция broom::bootstrap устарела, я перестроил свой подход с желаемым выводом, используя rsample::bootstraps. Кажется, гораздо сложнее получить желаемый результат. Я делаю что-то не так или все становится сложнее при создании сгруппированных бутстрапов?

data %>%
  dplyr::mutate(group2 = group,
                subgroup2 = subgroup) %>% 
  tidyr::nest(-group2, -subgroup2) %>% 
  dplyr::mutate(boot  = map(data, ~ rsample::bootstraps(., 100))) %>% 
  pull(boot) %>% 
  purrr::map(., "splits") %>% 
  transpose %>% 
  purrr::map(., ~ purrr::map_dfr(., rsample::analysis)) %>% 
  tibble(id = 1:length(.), data = .)
...