R:创建组间所有可能的组合,而无需组内组合

问题描述 投票:0回答:1

我有一个像这样的向量:

v <- c("v1" = 3, "v2" = 1, "v3" = 2, "v4" = 1, "v5" = 2, "v6" = 4,
       "v7" = 1, "v8" = 4, "v9" = 1, "v10" = 4, "v11" = 3, "v12" = 3)

名称是变量的名称,数字是组分配。例如,组 2 包含变量 v3 和 v5 (

v[which(v==2)]
)

我想创建所有组合,其中包括每组一个变量。来自同一组的变量不应以任何组合出现。

顺序并不重要,例如

v1,v3,v7,v8 == v3,v1,v7,v8
。仅应包含这两者之一。

我想出了一个循环解决方案:

combs <- combn(names(v), 4, simplify=F)
lis_combs_cleaned <- list()
for (i in 1:length(combs)){
  comb_i <- combs[[i]]
  if(sum(duplicated(v[comb_i])) == 0){
    lis_combs_cleaned[[as.character(i)]] <- comb_i
  }else{
    next
  }
}
asDF <- do.call("rbind", lis_combs_cleaned)

这似乎有效。然而,我的实际用例在

combs
中包含更多组合,并且循环遍历它们实际上并不可行。

所以我想知道是否有人有更有效的解决方案的想法?

r combinatorics
1个回答
0
投票

我们可以按组拆分列表,然后使用该列表与

expand.grid
来获取所有组合

do.call("expand.grid", split(v, v) |> lapply(names))
#     1  2   3   4
# 1  v2 v3  v1  v6
# 2  v4 v3  v1  v6
# 3  v7 v3  v1  v6
# 4  v9 v3  v1  v6
# ....
© www.soinside.com 2019 - 2024. All rights reserved.