【问题标题】:How to set different set.seed() per group and then sample()如何为每组设置不同的 set.seed() 然后 sample()
【发布时间】:2019-12-04 08:19:06
【问题描述】:

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

letters - 我的分组变量
seed - 一个动态的和特定于组/字母的整数
min - 最小值sample() 的值
ma​​x - sample() 的最大值

这是一个可重现的例子:

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))


非常感谢!

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案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
    

    【讨论】:

    • 完美。谢谢!
    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多