Jam*_*ton 6 algorithm split r vector unique
我想将一个值向量(其中一些是重复的)随机分配给较少数量的组,以便为每个组分配至少两个且不超过四个值,并且不将相同的值分配给同一组。
示例数据:
values <- c(2499,2499,2522,2522,2522,2522,2648,2648,2652,2652,2670,2670,2689,2689,2690,2690,2693,2693,2700,2700,2706,2706,2714,2714,2730,2730,2738,2738,2740,2740,2765,2765,2768,2768,2773,2773,2783,2783,2794,2794,2798,2798,2807,2807,2812,2812,2831,2831,2831,2835,2835,2836,2836,2836,2844,2844,2844,2846,2846,2846,2883,2883,2964,2964)
groups <- 1:26
Run Code Online (Sandbox Code Playgroud)
我试过:
split(values, sample(groups, length(values), repl = TRUE))
Run Code Online (Sandbox Code Playgroud)
这很接近我想要的。但有时这会导致只为一个组分配一个值,或者超过四个值。有时,相同的值(重复项之一)会分配给同一组。
所需的输出将所有值随机分布在组中,以便每组中的所有值都是唯一的(无重复),并且每组中最少有两个值,最多有四个值。
小智 1
定义值和组后,我会在 2 到 4 个值之间进行采样,删除重复项,检查之后是否至少有 2 个值,如果没有则重新采样,直到 TRUE 为止,并返回一个以组作为名称的列表
library(tidyverse)
groups <- 1:26
map(
.x = groups,
.f = ~{
# Sample variable length group size 2:4
res <- sample(values, sample(2:4, 1), replace = TRUE)
# remove duplicates
res <- res[!duplicated(res)]
# check for if length of no dups res is less than 2, if so, resample, repeat above
while(length(res) < 2){
res <- sample(values, sample(2:4, 1), replace = TRUE)
res <- res[!duplicated(res)]
}
res
}
) %>% # List with groups as names
set_names(., groups)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
122 次 |
最近记录: |