我有一个像这样的向量:
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
中包含更多组合,并且循环遍历它们实际上并不可行。
所以我想知道是否有人有更有效的解决方案的想法?
我们可以按组拆分列表,然后使用该列表与
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
# ....