【问题标题】:Trouble evaluating combinations from combn using purrr使用 purrr 从 combn 评估组合时遇到问题
【发布时间】: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 &lt;- function(vec, x) all(vec %in% x) | !any(vec %in% x); out &lt;- map(same_group, ~ keep(combinations_list, validate_combinations, vec = .x))

标签: r purrr


【解决方案1】:

我们可以改变函数来接受变量组

validate_combinations <- function(x, group) all(group %in% x) | !any(group %in% x)

然后对于每个group 子集的combinations_list 满足validate_combinations

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"
#......

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 2013-05-20
    • 2016-02-18
    相关资源
    最近更新 更多