将数据按 R 中的最小和最大大小分组

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)