【问题标题】:Trying to build an R function to randomly pair groups together each week but keep the new group sizes the same尝试构建一个 R 函数来每周将组随机配对,但保持新组的大小相同
【发布时间】:2021-11-02 14:54:03
【问题描述】:

如果我们有数据:

group group_size
a 2
b 3
c 1
d 4
e 2
f 4
g 1
h 3
i 1
j 3
k 1
l 1
  • 输入数据代码:
df <- data.frame(group = c("a","b","c","d","e","f","g","h","i","j","k","l"),
                 group_size = c(2,3,1,4,2,4,1,3,1,3,1,1))

并且我想将组随机配对或三组成更大的组,这些组的大小都相同,我将如何在 R 中执行此操作?对于我的结果 - 我希望所有组都与另一个组随机匹配,并让 4-5 个新组中的每一个都具有相同的大小。我需要每周随机重做一次,所以我想确保结果每次都可以随机化。

谢谢。

样本所需的输出:

new_grp members new_grp_size
group 1 a,c,e 5
group 2 b,l,g 5
group 3 d,k 5
group 4 j,h 6
group 5 i,f 5

请注意,所有组的大小都尽可能接近。

【问题讨论】:

  • 只是为了清楚:例如配对 a+b 和 c+d 是可以接受的,前提是可以从所有剩余的组构建配对和三重奏,这样每个新组也有 5 个成员。你在找这样的东西吗?
  • 是的,只要可以为未来的比赛随机分配!! @guero64
  • 我假设 "pair or trio" 与 2 和 3 的 group_size 没有关联,因此 group_size 变量更像是一个分组变量而不是使用它的价值,对吗?另外,"pair or trio" ...哪一个?任意/随机?如果我们随机将组配对并且有一组 1 会发生什么?显示预期的输出可能会有所帮助(知道您希望它是随机的)。
  • 最后,当我们检查所有组的大小是否相同时,组大小变量很重要。所以我认为最好的办法是告诉 R 我们希望在每个组中有多少人(总和(组大小)/组数),然后让 R 决定哪些组应该是三人组,哪些应该是双人组,哪些应该是四人组等等。这样做的整个目标是避免使用比其他组小得多的组。
  • 这实际上是计算机科学中的一个老问题,称为 k-way-partitioning 问题 (en.wikipedia.org/wiki/Partition_problem)。有一些近似值和精确算法可以解决这个问题,但我不知道 r-package 是否实现了这些,但如果你搜索分区,也许你可以找到一个。

标签: r dataframe


【解决方案1】:

改编自CrossValidated: Partition a vector into equally sized groups 的简单方法。您可以通过调整seed 来生成新的分组。

代码

group_size <- 5

set.seed(2021)
sample_groups <- sample(groups, length(groups))

f <- approxfun(
    c(0, cumsum(sample_groups)/sum(sample_groups)), 
    c(0, seq_along(sample_groups))
) 

i <- f(seq(0, 1, length.out = group_size + 1))
j <- rep(0, length(sample_groups))
j[round(1 + i[-length(i)])] <- 1
grouping <- cumsum(j)

结果

tibble(
    group = names(sample_groups),
    n = sample_groups,
    grouping = grouping
) %>%
    group_by(
        grouping
    ) %>%
    summarise(
        n = sum(n),
        groups = paste(group, collapse = ", ")
    )
# A tibble: 5 × 3
  grouping     n groups 
     <dbl> <dbl> <chr>  
1        1     5 g, f   
2        2     4 j, l   
3        3     7 d, h   
4        4     5 k, c, b
5        5     5 i, a, e

数据

library(tidyverse)
groups <- c(
    "a" = 2,
    "b" = 3,
    "c" = 1,
    "d" = 4,
    "e" = 2,
    "f" = 4,
    "g" = 1,
    "h" = 3,
    "i" = 1,
    "j" = 3,
    "k" = 1,
    "l" = 1
)

【讨论】:

    猜你喜欢
    • 2020-04-30
    • 2014-06-10
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    相关资源
    最近更新 更多