1

假设我有两个或多个向量,每个向量都有 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")

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

4

3 回答 3

0

例如,生成 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"
于 2021-05-11T16:06:14.273 回答
0

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

合并向量中的每个位置都可以被认为来自离散的定量因素,而来自你的因素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
于 2021-05-11T15:15:23.320 回答
0

这适用于两个向量。

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"
于 2021-05-11T12:49:23.723 回答