【发布时间】:2019-07-11 14:08:31
【问题描述】:
我正在尝试使用 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)
我想以这种方式组合 -> 减少每个组,直到我拥有所有有效组合的列表。我不确定如何结合combinations_list、validate_combinations 和same_group 来检查所有same_group“规则”与表中的组合。我能得到的最远的结果是检查一个组合 c("a", "c"),当针对 keep(combinations_list, validate_combinations) 运行时,它确实给了我想要的输出。
我想一旦我能做到这一点,我就可以在另一个组合函数中为 6 组和 10 组使用未选择的值。
【问题讨论】:
-
你在哪里使用
same_group -
是的,这正是我的问题。它应该进入 validate_combination 函数的某个位置,而不是硬编码的 c("a", "c") ,它们是该列表的第一个元素,但我无法弄清楚那个抽象级别。
-
我会将函数从 function(x, y) all (y %in% x)...` 更改并使用
map循环组合列表并使用 y 应用函数跨度> -
试试
validate_combinations <- function(vec, x) all(vec %in% x) | !any(vec %in% x); out <- map(same_group, ~ keep(combinations_list, validate_combinations, vec = .x))