我尝试使用combn将一组n= 20个不同的单元划分为3个大小不等的组-- 4、6和10。然后,我尝试验证必须在一个组中同时存在的值--如果该对中的一个元素存在于该组中,则另一个元素也应该在该组中。如果一个不在组中,那么两个都不应该在组中。以这种方式,我想评估这些组,以便找到所有可能的有效解决方案,其中规则是真的。
x <- letters[1:20]
same_group <- list(
c("a", "c"),
c("d", "f"),
c("b", "k", "r")
)
combinations_list <- combn(x, 4, simplify = F)
validate_combinations <- function(x) all(c("a", "c") %in% x) | !any(c("a", "c") %in% x)
valid_combinations <- keep(combinations_list, validate_combinations)通过这种方式,我想合并->,reduce,每个组,直到我有了所有有效组合的列表。我不确定如何组合combinations_list、validate_combinations和same_group来对照表格中的组合检查所有same_group“规则”。我最多只能检查一个组合c("a","c"),当对keep(combinations_list,validate_combinations)运行时,它确实给出了我想要的输出。
我认为一旦我可以这样做,我就可以在另一个combn函数中对6组和10组使用未挑选的值。
发布于 2019-07-12 15:02:43
我们可以更改函数以接受变量组
validate_combinations <- function(x, group) all(group %in% x) | !any(group %in% x)然后,对于每个group子集,满足validate_combinations的combinations_list
lapply(same_group, function(x) combinations_list[
sapply(combinations_list, function(y) validate_combinations(y, x))])
#[[1]]
#[[1]][[1]]
#[1] "a" "b" "c" "d"
#[[1]][[2]]
#[1] "a" "b" "c" "e"
#[[1]][[3]]
#[1] "a" "b" "c" "f"
#[[1]][[4]]
#[1] "a" "b" "c" "g"
#[[1]][[5]]
#[1] "a" "b" "c" "h"
#[[1]][[6]]
#[1] "a" "b" "c" "i"
#[[1]][[7]]
#[1] "a" "b" "c" "j"
#[[1]][[8]]
#[1] "a" "b" "c" "k"
#......https://stackoverflow.com/questions/56991167
复制相似问题