一组固定参数组合的所有值组合

时间:2017-09-16 07:09:47

标签: r permutation combinatorics

问题

我正在寻找一种方法来创建一组参数及其值的所有可能组合的列表,其中每个参数在输出中只存在一次。输入集的示例如下所示:

sampleData = data.frame(Parameter= c("A","B","B","C","C","C","D","D"),
                           Value = c(1,0.9,1,0.8,1,1.2,0.8,1.1))
  Parameter Value
1         A   1.0
2         B   0.9
3         B   1.0
4         C   0.8
5         C   1.0
6         C   1.2
7         D   0.8
8         D   1.1

所需的输出是所有唯一ABCD组合的列表,因此列表的前两个元素是例如

[[1]]
      Parameter Value
1         A   1.0
2         B   0.9
3         C   0.8
4         D   0.8
[[2]]
      Parameter Value
1         A   1.0
2         B   1.0
3         C   0.8
4         D   0.8

到目前为止我的尝试 我查看了combinations包中的gtools函数,以下内容与我想要的内容相近

combinations(n = nrow(sampleData),
             r = length(unique(sampleData$Parameter)),
             v = paste0(sampleData$Parameter,"_",sampleData$Value))

通过一些后处理,我将能够得到所需的结果。

combinations也会产生类似

的结果
      Parameter Value
1         A   1.0
2         B   0.9
3         B   1.0
4         D   0.8

即。一个(或多个)参数多次出现。

我将能够对此进行后期处理,但组合的输出会很快变大(此示例已经为70,增长为nr!),而所需的输出列表增长很多不那么快(在这个例子中12个,并且增长得慢得多)。

所以我的问题是:是否有一种(相对)有效的方法来生成所需的ABCD值组合输出而不先生成更大的集合然后剥离无效的组合?

1 个答案:

答案 0 :(得分:4)

我认为你正在寻找expand.grid()

以下内容将返回一个数据框,其中包含一行中的每个唯一组合:

library(dplyr)

df <- sampleData %>%
  split(.$Parameter) %>%              # create a dataframe of values for each parameter
  lapply(function(df){df$Value}) %>%  # extract the values for each parameter as an array
  expand.grid()                       # generate all combinations

> df
   A   B   C   D
1  1 0.9 0.8 0.8
2  1 1.0 0.8 0.8
3  1 0.9 1.0 0.8
4  1 1.0 1.0 0.8
5  1 0.9 1.2 0.8
6  1 1.0 1.2 0.8
7  1 0.9 0.8 1.1
8  1 1.0 0.8 1.1
9  1 0.9 1.0 1.1
10 1 1.0 1.0 1.1
11 1 0.9 1.2 1.1
12 1 1.0 1.2 1.1

如果您希望将结果转换为数据框列表:

library(tidyr)

df %>%
  mutate(combination = row_number()) %>%
  gather(Parameter, Value, -combination) %>%
  split(.$combination) %>%
  lapply(function(d){d[,-1]})

$`1`
   Parameter Value
1          A   1.0
13         B   0.9
25         C   0.8
37         D   0.8

$`2`
   Parameter Value
2          A   1.0
14         B   1.0
26         C   0.8
38         D   0.8
...