簡體   English   中英

如何組合多個向量,使每個向量的元素盡可能均勻分布?

[英]How to combine multiple vectors such that elements of each vector are distributed as equally as possible?

假設我有兩個或多個向量,每個向量都有 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")

將是最好的解決方案。 有沒有內置的 function 可以做到這一點? 任何想法如何實現它?

這適用於兩個向量。

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"

從實驗設計優化的角度考慮問題,我們可以使用MaxPro package 中的MaxProQQ function 得到一個通用的解決方案。

合並向量中的每個 position 都可以被認為來自離散的定量因素,而來自v1v2等的因素可以被認為是定性因素。 這是一些示例代碼( MaxProQQ采用 integer 因子而不是字符,但您可以在之后進行轉換):

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

例如,生成 100 個樣本,無需從 c(v1, v2) 替換,給出 m,即 5x100,每個樣本一列。 然后找到每組頻率的方差之和最小的列。 如果有兩個以上的向量,只需在標有 ## 的行中連接它們,代碼的 rest 保持不變。

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM