Dplyr: рд╕рдореВрд╣реЛрдВ рдХрд╛ рдирдореВрдирд╛ рд▓реЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 28 рдорд╛рд░реНрдЪ 2014  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: tidyverse/dplyr

рд╕рд╛рде рд╣реА рд╕рдореВрд╣реЛрдВ рдХреЗ рднреАрддрд░ рдХреЗ рд╡реНрдпрдХреНрддрд┐

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@drhagen рджреНрд╡рд╛рд░рд╛ рдЙрдкрд░реЛрдХреНрдд рдЙрддреНрддрд░

sample_n_groups = function(tbl, size, replace = FALSE, weight = NULL) {
  # regroup when done
  grps = tbl %>% groups %>% lapply(as.character) %>% unlist
  # check length of groups non-zero
  keep = tbl %>% summarise() %>% ungroup() %>% sample_n(size, replace, weight)
  # keep only selected groups, regroup because joins change count.
  # regrouping may be unnecessary but joins do something funky to grouping variable
  tbl %>% right_join(keep, by=grps) %>% group_by_(.dots = grps)
}

рд╕рднреА 9 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

species <- iris %.% 
  group_by(Species) %.% 
  summarise(wt = sum(Sepal.Length)) %.%
  sample_n(5, replace = T, weight = wt) %.%
  select(-wt)

inner_join(species, iris)

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрдВрдж рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛? рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ

iris %>%
    group_by(Species) %>%
    sample_n(1)

рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреНрд░рдЬрд╛рддрд┐рдпреЛрдВ рд╕реЗ рд╕рднреА рдбреЗрдЯрд╛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП sample_n рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╕рдореВрд╣реЛрдВ рдХреЗ рднреАрддрд░ рдирдореВрдирд╛ рд▓реЗрдирд╛ рдЗрд╕рдХрд╛ рд╕рд╣рдЬ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдВрдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╕рдореВрд╣реЛрдВ рдХрд╛ рдирдореВрдирд╛ рд▓реЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЕрдХреНрд╕рд░ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рджреВрд╕рд░рд╛ рдХрд╛рд░реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╣рд╛рдВ рд╣реИ:

sample_n_groups = function(tbl, size, replace = FALSE, weight=NULL) {
   # regroup when done
   grps = tbl %>% groups %>% unlist %>% as.character
   # check length of groups non-zero
   keep = tbl %>% summarise() %>% sample_n(size, replace, weight)
   # keep only selected groups, regroup because joins change count.
   # regrouping may be unnecessary but joins do something funky to grouping variable
   tbl %>% semi_join(keep) %>% group_by_(grps) 
}

@rcorty рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЕрднреА рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

iris %>% group_by(Species) %>% sample_n_groups(1)

+1

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: dplyr рдкрд░рд┐рд╡рд░реНрддрди рдиреЗ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рддреЛрдбрд╝ рджрд┐рдпрд╛;


рдЖрдк рдореЗрдВ рд╕реЗ рдЬреЛ рд▓реЛрдЧ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЦреЛрдЬ рдЗрдВрдЬрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╣рд╛рдВ рдкрд╣реБрдВрдЪреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП @MarcusWalz рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди replace = TRUE рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╕рд╛рде рдирдореВрдирд╛ рдирд╣реАрдВ рд╣реИред рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ right_join (рдпрд╛ left_join рдпрд╛ inner_join ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

sample_n_groups = function(tbl, size, replace = FALSE, weight=NULL) {
  # regroup when done
  grps = tbl %>% groups %>% unlist %>% as.character
  # check length of groups non-zero
  keep = tbl %>% summarise() %>% sample_n(size, replace, weight)
  # keep only selected groups, regroup because joins change count.
  # regrouping may be unnecessary but joins do something funky to grouping variable
  tbl %>% right_join(keep, by=grps) %>% group_by_(grps) 
}

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╕реНрдЯрд░ рдмреВрдЯрд╕реНрдЯреНрд░реИрдкрд┐рдВрдЧ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред

@drhagen , рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдПрдХ рдирдИ рдЕрджреНрд╡рд┐рддреАрдп рд╕рдореВрд╣ рдЖрдИрдбреА рдХреИрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ?

рджрд░рдЕрд╕рд▓, рдпрд╣ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ:

sample_n_groups = function(tbl, size, replace = FALSE, weight=NULL) {
  # regroup when done
  grps = tbl %>% groups %>% unlist %>% as.character
  # check length of groups non-zero
  keep = tbl %>% summarise() %>% sample_n(size, replace, weight) %>% 
    mutate(unique_id = 1:NROW(.))
  # keep only selected groups, regroup because joins change count.
  # regrouping may be unnecessary but joins do something funky to grouping variable
  tbl %>% right_join(keep, by=grps) %>% group_by_(grps) 
}

@drhagen рджреНрд╡рд╛рд░рд╛ рдЙрдкрд░реЛрдХреНрдд рдЙрддреНрддрд░

sample_n_groups = function(tbl, size, replace = FALSE, weight = NULL) {
  # regroup when done
  grps = tbl %>% groups %>% lapply(as.character) %>% unlist
  # check length of groups non-zero
  keep = tbl %>% summarise() %>% ungroup() %>% sample_n(size, replace, weight)
  # keep only selected groups, regroup because joins change count.
  # regrouping may be unnecessary but joins do something funky to grouping variable
  tbl %>% right_join(keep, by=grps) %>% group_by_(.dots = grps)
}
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

JohnMount picture JohnMount  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

chrislad picture chrislad  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tjmahr picture tjmahr  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Prometheus77 picture Prometheus77  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

yutannihilation picture yutannihilation  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ