我有一个项目列表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'将变得超级巨大。因此,我认为在飞行中建立“组合”可能会更好 - 在考虑到禁令的情况下。但是,似乎,我必须在所有项目中构建一个非常长的循环。问题:
或许在R中有一种方法可以像Python一样构建迭代器或堆栈,这样我就可以将我的'combos'构建为一个堆栈,然后一次评估每一行?
我建议的任何建议或解决方案是唯一合理的建议吗? 非常感谢你!