【问题标题】:How to combine multiple vectors such that elements of each vector are distributed as equally as possible?如何组合多个向量,使每个向量的元素尽可能均匀分布?
【发布时间】:2021-05-11 12:46:39
【问题描述】:

假设我有两个或多个向量,每个向量都有 to 或多个元素(单因子),例如

v1 = c("a", "a", "a")
v2 = c("b", "b")

我要做的是合并所有向量并尽可能平均地分配每个组的元素。

对于上面的简单示例,只有一个解决方案:

c("a", "b", "a", "b", "a")

如果v1 = c("a", "a", "a", "a")其中任何一个

c("a", "b", "a", "b", "a", "a")
c("a", "b", "a", "a", "b", "a")
c("a", "a", "b", "a", "b", "a")

将是最好的解决方案。有没有内置函数可以做到这一点?任何想法如何实现它?

【问题讨论】:

  • 你是否只有 2 个因子 (a/b)?
  • 每个向量都包含一个独特的因素,所以是的。最好有一个 x 向量的通用解决方案。但仅适用于 2 个向量也可以

标签: r combinations combinatorics


【解决方案1】:

这适用于两个向量。

v1 = c("a", "a", "a")
v2 = c("b", "b")

distribute_equally <- function(v1, v2) {
  v3 <- c(v1, v2)
  tab <- sort(table(v3))
  c(rep(names(tab), min(tab)), rep(names(tab)[2], diff(range(tab))))
}

distribute_equally(v1, v2)
#[1] "b" "a" "b" "a" "a"

distribute_equally(c('a', 'a'), c('b', 'b'))
#[1] "a" "b" "a" "b"

【讨论】:

    【解决方案2】:

    从实验设计优化的角度考虑问题,我们可以使用MaxPro包中的MaxProQQ函数得到一个通用的解决方案。

    合并向量中的每个位置都可以认为是来自离散的定量因素,而来自您的v1v2 等的因素可以认为是定性因素。这是一些示例代码(MaxProQQ 采用整数因子而不是字符,但您可以在之后进行转换):

    library(MaxPro)
    
    set.seed(1)
    
    v1 <- rep(1, sample.int(10, 1))
    v2 <- rep(2, sample.int(10, 1))
    v3 <- rep(3, sample.int(10, 1))
    v4 <- rep(4, sample.int(10, 1))
    
    vComb <- c(v1, v2, v3, v4)
    vMerge1234 <- MaxProQQ(cbind(1:length(vComb), sample(vComb, length(vComb))), p_nom = 1)$Design
    vMerge1234 <- vMerge1234[order(vMerge1234[,1]),][,2]
    
    > vMerge1234
     [1] 4 3 4 2 4 3 4 1 2 4 3 4 2 4 3 1 4 3 2 4 1 3 4
    

    【讨论】:

      【解决方案3】:

      生成 100 个样本,例如,无需从 c(v1, v2) 替换,得到 m,即 5x100,每个样本一列。然后找到每组频率的方差之和最小的列。如果有两个以上的向量,只需在标有 ## 的行中将它们连接起来,其余代码保持不变。

      set.seed(123)
      v1 = c("a", "a", "a")
      v2 = c("b", "b")
      
      v <- c(v1, v2) ##
      m <- replicate(100, sample(v))
      varsum <- apply(m, 2, function(x) {
        f <- factor(x, levels = unique(v))
        sum(tapply(f, v, function(x) var(table(x))))
      })
      m[, which.min(varsum)]
      ## [1] "a" "a" "b" "b" "a"
      

      【讨论】:

        猜你喜欢
        • 2020-08-14
        • 2015-06-29
        • 1970-01-01
        • 1970-01-01
        • 2021-03-06
        • 1970-01-01
        • 2021-01-11
        • 2012-07-02
        • 1970-01-01
        相关资源
        最近更新 更多