r - 如何为每组设置不同的 set.seed() 然后 sample()
问题描述
我想在分组后对 data.frame 的 Min 到 Max 列中的任何数字进行采样,并且每个组都有不同的种子。我尝试了几种方法,您可以在下面的可重现示例中看到它们,但它们都不起作用。
data.frame 由四列组成:
字母- 我的分组变量
种子- 一个动态的整数和特定于组/字母的整数
min - sample() 的
最小值 max - 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))
提前谢谢了!
解决方案
我建议pmap
从purrr
你最后一行的包中使用:
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
推荐阅读
- angular - 无法对 Illustrator 对象的拖放执行 datatransfer.getData()
- java - Java 流映射调用另一个构造函数
- c# - 如何在 Web API 的 GET 方法中使用 Dictionary 作为参数?
- c - 使用带有指针的 typedef const 结构
- go - 结构声明中的文字值
- java - ANDROID:保存第一项后从列表视图获取下一项到editText
- excel - Countif 基于 Excel 中带有过滤器的另一列
- go - 非标准变量名
- .net-core - 如何在.net core angular SPA模板中检测页面刷新?
- azure - 错误“请求的域已存在于 Azure 数据库中。” 在 Azure 上购买域时