繁体   English   中英

如何为每组设置不同的 set.seed() 然后是 sample()

[英]How to set different set.seed() per group and then sample()

我想在分组后从一个 data.frame 的 Min 到 Max 列中采样任何数字,并且每个组都有不同的种子。 我尝试了几种方法,您可以在下面的可重现示例中看到它们,但它们都不起作用。
data.frame 包含四列:

字母- 我的分组变量
种子- 一个动态且特定于组/字母的整数
min - sample() 的最小值
max - 样本的最大值()

这是一个可重现的示例:

set.seed(123)
data.frame(letter = sample(letters[1:3],20, replace=TRUE)) %>% 
  group_by(letter) %>% 
  summarise(seed = n()) %>% 
  mutate(min = ifelse(letter == "a", 20,
                      ifelse(letter == "b", 40, 60)),
         max = ifelse(letter == "a", 30,
                      ifelse(letter == "b", 50, 70)))  %>%

  group_by(letter) %>%
  # set.seed(seed) %>%  # or mutate(randomNumber = sample(min:max, 1, set.seed(seed))) # these aren't working, but I hope you get my point 
  mutate(randomNumber = sample(min:max, 1))


提前谢谢了!

我建议在最后一行使用purrr包中的pmap

library(tidyverse)

set.seed(123)
data.frame(letter = sample(letters[1:3],20, replace=TRUE)) %>% 
  group_by(letter) %>% 
  summarise(seed = n()) %>% 
  mutate(min = ifelse(letter == "a", 20,
                      ifelse(letter == "b", 40, 60)),
         max = ifelse(letter == "a", 30,
                      ifelse(letter == "b", 50, 70)))  %>%

  group_by(letter) %>%
  mutate(randomNumber = pmap_dbl(list(min, max, seed), function(x, y, z){set.seed(z); sample(x:y, 1)}))


# A tibble: 3 x 5
# Groups:   letter [3]
  letter  seed   min   max randomNumber
  <fct>  <int> <dbl> <dbl>        <dbl>
1 a          5    20    30           21
2 b          7    40    50           49
3 c          8    60    70           63

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM