R expand.grid但禁止

时间:2018-01-12 17:01:14

标签: r loops grid constraints

我有一个项目列表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中的循环很慢。
  3. 或许在R中有一种方法可以像Python一样构建迭代器或堆栈,这样我就可以将我的'combos'构建为一个堆栈,然后一次评估每一行?

    我建议的任何建议或解决方案是唯一合理的建议吗? 非常感谢你!

1 个答案:

答案 0 :(得分:0)

你试过wildcard package吗?它就像expand.grid(),但更灵活。