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

R 如何为每个组设置不同的set.seed(),然后设置sample(),r,dataframe,dplyr,R,Dataframe,Dplyr,我想在分组后对data.frame的最小到最大列中的任何数字进行采样,每个组都有不同的种子。我尝试了几种方法,您可以在下面的可复制示例中看到它们,但它们都不起作用。 data.frame由四列组成: 字母-我的分组变量 种子-一个动态的、特定于组/字母的整数 min-样本的最小值() max-样本()的最大值 以下是一个可复制的示例: set.seed(123) data.frame(letter = sample(letters[1:3],20, replace=TRUE)) %>%

我想在分组后对data.frame的最小到最大列中的任何数字进行采样,每个组都有不同的种子。我尝试了几种方法,您可以在下面的可复制示例中看到它们,但它们都不起作用。
data.frame由四列组成:

字母-我的分组变量
种子-一个动态的、特定于组/字母的整数
min-样本的最小值() 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
库(tidyverse)
种子集(123)
data.frame(字母=样本(字母[1:3],20,replace=TRUE))%>%
分组单位(字母)%>%
摘要(seed=n())%>%
变异(最小=ifelse)(字母=a),20,
如果其他(字母==“b”,40,60)),
最大值=ifelse(字母=“a”,30,
ifelse(字母==“b”,50,70))%>%
分组单位(字母)%>%
mutate(randomNumber=pmap_dbl(list(min,max,seed),function(x,y,z){set.seed(z);sample(x:y,1)}))
#一个tibble:3x5
#分组:字母[3]
字母种子最小最大随机数
1 a 5 20 30 21
2 b 7 40 50 49
3 c 8 60 70 63

它非常完美。非常感谢。