[英]How to set different set.seed() per group and then sample()
I would like to sample any number from Min to Max column of a data.frame after grouping and every group having different seed.我想在分组后从一个 data.frame 的 Min 到 Max 列中采样任何数字,并且每个组都有不同的种子。 I've tried a few approaches, you can see them in the reproducible example below, but none of them work.我尝试了几种方法,您可以在下面的可重现示例中看到它们,但它们都不起作用。
The data.frame consists of four columns: data.frame 包含四列:
letters - my grouping variable字母- 我的分组变量
seed - an integer that is dynamic and group/letter specific种子- 一个动态且特定于组/字母的整数
min - minimum value for the sample() min - sample() 的最小值
max - maximum value for the sample() max - 样本的最大值()
Here is a reproducible example:这是一个可重现的示例:
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))
Many thanks in advance!提前谢谢了!
I would suggest to use pmap
from the purrr
package in your last row:我建议在最后一行使用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.