【问题标题】:R expand.grid but with prohibitionsR expand.grid 但有禁令
【发布时间】:2018-06-22 04:26:30
【问题描述】:

我有一个 v1、v2 等项目的列表。重要提示:它的长度事先不知道!!

每个项目(v1、v2 等)都显示可能的级别:1:2、1:3 等。我需要创建一个数据框,其中包含项目 v1、v2 等的所有可能的级别组合。我可以做到它非常有效地使用“expand.grid”:

mylist <- list(v1 = 1:3, v2 = 1:3, v3 = 1:3)
combos <- expand.grid(mylist, KEEP.OUT.ATTRS = FALSE)

但随之而来的是并发症。某些项目的某些级别被禁止一起出现,例如v2 == 1 和 v3 == 1 不能组合。以下是我如何定义此类禁令(这里有两个禁令):

prohibitions = data.frame(item1 = c("v1", "v2"), Level1 = c(1,2),
                          item2 = c("v3", "v3"), Level2 = c(1,3),
                          stringsAsFactors = FALSE)
prohibitions

当然,我可以将 expand.grid ('combos') 的结果与所有可能的项目级别组合一起使用,然后删除包含禁止的行:

for(row in 1:nrow(prohibitions)){
  item1 <- prohibitions[row, 'item1']
  item1_level <- prohibitions[row, 'Level1']
  item2 <- prohibitions[row, 'item2']
  item2_level <- prohibitions[row, 'Level2']
  # Removing rows that contain prohibited combinations:
  combos <- combos[!(combos[[item1]] == item1_level &
                       combos[[item2]] == item2_level), ]
}

但是,我不确定这是一种有效的方法。主要是当'mylist'很长,一些属性有很多级别时,'combos'会变得超级庞大。因此,我认为“即时”构建“组合”可能会更好——同时考虑到这些禁令。但是,似乎我必须在所有项目中建立一个很长的循环。问题:

  1. 我不知道如何通过一堆项目(v1、v2 等)编写循环 - 因为我事先不知道其中有多少。
  2. R 中的循环很慢。

或者也许 R 中有一种方法可以像在 Python 中一样构建迭代器或堆栈,以便我可以将我的“组合”构建为堆栈,然后一次评估每一行?

任何建议或者我上面提出的解决方案是唯一合理的解决方案吗? 非常感谢!

【问题讨论】:

  • 您实际使用了多少种组合和禁令。这个例子没有明确说明技术挑战是什么,或者说这确实是推动禁令的规则。 R 没有像 Python 这样的迭代器。如果你的 reproducible example 有更真实的数据和时间,那就太好了,这样我们就可以看到你的运行时间是多少以及你需要它是什么。
  • 公平点。我正在查看一个具有以下“mylist”规格的现实(小)示例: mylist

标签: r loops grid constraints


【解决方案1】:

你试过wildcard package吗?类似于expand.grid(),但更灵活一些。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多